使用C# 发送不同信息格式的http请求
Posted _iorilan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C# 发送不同信息格式的http请求相关的知识,希望对你有一定的参考价值。
1.最常见的post json
var jsonObject = JsonConvert.SerializeObject(model);
...
var str = new StringContent(jsonObject, Encoding.UTF8, "application/json");
...
2. url encoded content格式
...
var formContent = new FormUrlEncodedContent(new[]
new KeyValuePair<string, string>("k1", "v1"),
new KeyValuePair<string, string>("k2", "v2")
);
var request = new HttpRequestMessage
Content = formContent,
Method = HttpMethod.Post,
RequestUri = new Uri(url)
;
var ret = httpClient.SendAsync(request).Result;
也可以使用以下辅助函数来完成
private static TRes ApiCallAsFormData<TRes>(string url, IEnumerable<KeyValuePair<string, string>> data)
try
using (var httpClient = new HttpClient())
var formContent = new FormUrlEncodedContent(data);
var ret = httpClient.PostAsync(url, formContent).Result;
var jsonRet = ret.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<TRes>(jsonRet);
catch (Exception ex)
_log.Error(ex);
return default(TRes);
...
3. 发送其他 http 请求类型 (PUT,DELETE,PATCH)
...
var request = new HttpRequestMessage
Method = HttpMethod.Delete,
RequestUri = new Uri($"url")
;
var ret = httpClient.SendAsync(request).Result;
...
3.post文件,multiplart类型
可使用以下helper类完成(可传递oauth token或cookie)
public class FormUploadHelper
private static readonly Encoding encoding = Encoding.UTF8;
public static HttpWebResponse MultipartFormDataPost(string postUrl,
string userAgent,
Dictionary<string, object> postParameters, string token, IList<Cookie> cookies = null)
string formDataBoundary = String.Format("----------0:N", Guid.NewGuid());
string contentType = "multipart/form-data; boundary=" + formDataBoundary;
byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);
return PostForm(postUrl, userAgent, contentType, formData, token, cookies);
private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType,
byte[] formData, string token, IList<Cookie> cookies)
HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;
if (request == null)
throw new NullReferenceException("request is not a http request");
// Set up the request properties.
request.Method = "POST";
request.ContentType = contentType;
if (!string.IsNullOrEmpty(token))
request.Headers.Add("accessToken", token);
if (cookies != null && cookies.Count > 0)
if (request.CookieContainer == null)
request.CookieContainer = new CookieContainer();
foreach (var cookie in cookies)
request.CookieContainer.Add(cookie);
else
request.CookieContainer = new CookieContainer();
request.UserAgent = userAgent;
request.ContentLength = formData.Length;
// You could add authentication here as well if needed:
// request.PreAuthenticate = true;
// request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
// request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("username" + ":" + "password")));
// Send the form data to the request.
using (Stream requestStream = request.GetRequestStream())
requestStream.Write(formData, 0, formData.Length);
requestStream.Close();
return request.GetResponse() as HttpWebResponse;
private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)
Stream formDataStream = new System.IO.MemoryStream();
bool needsCLRF = false;
if (postParameters != null)
foreach (var param in postParameters)
// Thanks to feedback from commenters, add a CRLF to allow multiple parameters to be added.
// Skip it on the first parameter, add it to subsequent parameters.
if (needsCLRF)
formDataStream.Write(encoding.GetBytes("\\r\\n"), 0, encoding.GetByteCount("\\r\\n"));
needsCLRF = true;
if (param.Value is FileParameter)
FileParameter fileToUpload = (FileParameter)param.Value;
// Add just the first part of this param, since we will write the file data directly to the Stream
string header = string.Format(
"--0\\r\\nContent-Disposition: form-data; name=\\"1\\"; filename=\\"2\\"\\r\\nContent-Type: 3\\r\\n\\r\\n",
boundary,
param.Key,
fileToUpload.FileName ?? param.Key,
fileToUpload.ContentType ?? "application/octet-stream");
formDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));
// Write the file data directly to the Stream, rather than serializing it to a string.
formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length);
else
string postData = string.Format(
"--0\\r\\nContent-Disposition: form-data; name=\\"1\\"\\r\\n\\r\\n2",
boundary,
param.Key,
param.Value);
formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData));
// Add the end of the request. Start with a newline
string footer = "\\r\\n--" + boundary + "--\\r\\n";
formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));
// Dump the Stream into a byte[]
formDataStream.Position = 0;
byte[] formData = new byte[formDataStream.Length];
formDataStream.Read(formData, 0, formData.Length);
formDataStream.Close();
return formData;
4.请求中携带cookie
获取cookie
using (var handler = new HttpClientHandler())
using (var httpClient = new HttpClient(handler))
...
CookieContainer cookies = new CookieContainer();
handler.CookieContainer = cookies;
...
HttpResponseMessage authenticationResponse = httpClient.PostAsync(uri, str).Result;
var sessionCookie = cookies.GetCookies(uri).Cast<Cookie>().ToList();
...
发送cookie
using (var handler = new HttpClientHandler())
using (var httpClient = new HttpClient(handler))
...
...
foreach (var cookie in __sessionCookie)
handler.CookieContainer.Add(cookie);
...
5. http 长连接异步逐行解析
using (HttpWebResponse webResponse = req.GetResponse(uri))
using (Stream responseStream = webResponse.GetResponseStream())
if (responseStream != null)
using (StreamReader streamReader = new StreamReader(responseStream))
while (!streamReader.EndOfStream)
response = await streamReader.ReadLineAsync();
...
以上是关于使用C# 发送不同信息格式的http请求的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 HTTP 使用 Java(或 C#)中的摘要身份验证 HTTP 发送 SOAP 请求?
C# HttpWebRequest GET HTTP HTTPS 请求