使用 POST 方法将 HttpWebRequest 转换为 HttpClient
Convert HttpWebRequest to HttpClient with POST method
我尝试将 HttpWebRequest 转换为 HttpClient 但没有成功。
有人可以帮助我吗?
这是我使用 HttpWebRequest 的简单代码:
string url = "https://www.somesite.com/Service";
string postData = "text to send";
var data = Encoding.ASCII.GetBytes(postData);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.Proxy = null;
request.AllowAutoRedirect = false;
request.UserAgent = "Mozilla/5.0";
request.ContentType = "text/x-gwt-rpc; charset=UTF-8";
request.Headers.Add("Cookie", SetCookie);//get it after login
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseText = reader.ReadToEnd();
我认为您可以将基于 HttpWebRequest
的代码转换为基于 HttpClient
的代码,如下所示:
string url = "https://www.somesite.com/Service";
string postData = "text to send";
var data = Encoding.ASCII.GetBytes(postData);
var content = new ByteArrayContent(data);
using var httpHandler = new HttpClientHandler { UseCookies = false, AllowAutoRedirect = false };
using var client = new HttpClient(httpHandler);
client.DefaultRequestHeaders.Add("UserAgent","Mozilla/5.0");
client.DefaultRequestHeaders.Add("ContentType", "text/x-gwt-rpc; charset=UTF-8");
client.DefaultRequestHeaders.Add("Cookie", SetCookie);
using var requestMessage = new HttpRequestMessage(HttpMethod.Post, url) { Content = content };
var response = await client.SendAsync(requestMessage);
var responseText = await response.Content.ReadAsStringAsync();
备注:
- 您可以使用 ByteArrayContent abstraction for this. (Related SO topic)
而不是手动编写请求的流
- 为了手动设置 cookie,您必须 turn-off 默认行为。您可以通过 HttpClientHandler's UseCookies. (Related SO topic)
- 要手动设置 headers,您可以使用 HttpClient's DefaultRequestHeaders (Related SO topic)
GetResponse
对应的是 SendAsync
- 您可以使用 HttpContent's ReadAsStringAsync (Related SO topic)
而不是手动读取响应流
UPDATE: 包含 OP 的修改代码
var content = new StringContent(postData, Encoding.UTF8, "text/x-gwt-rpc");
因此,使用 StringContent 而不是 ByteArrayContent
。
我尝试将 HttpWebRequest 转换为 HttpClient 但没有成功。 有人可以帮助我吗?
这是我使用 HttpWebRequest 的简单代码:
string url = "https://www.somesite.com/Service";
string postData = "text to send";
var data = Encoding.ASCII.GetBytes(postData);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.Proxy = null;
request.AllowAutoRedirect = false;
request.UserAgent = "Mozilla/5.0";
request.ContentType = "text/x-gwt-rpc; charset=UTF-8";
request.Headers.Add("Cookie", SetCookie);//get it after login
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseText = reader.ReadToEnd();
我认为您可以将基于 HttpWebRequest
的代码转换为基于 HttpClient
的代码,如下所示:
string url = "https://www.somesite.com/Service";
string postData = "text to send";
var data = Encoding.ASCII.GetBytes(postData);
var content = new ByteArrayContent(data);
using var httpHandler = new HttpClientHandler { UseCookies = false, AllowAutoRedirect = false };
using var client = new HttpClient(httpHandler);
client.DefaultRequestHeaders.Add("UserAgent","Mozilla/5.0");
client.DefaultRequestHeaders.Add("ContentType", "text/x-gwt-rpc; charset=UTF-8");
client.DefaultRequestHeaders.Add("Cookie", SetCookie);
using var requestMessage = new HttpRequestMessage(HttpMethod.Post, url) { Content = content };
var response = await client.SendAsync(requestMessage);
var responseText = await response.Content.ReadAsStringAsync();
备注:
- 您可以使用 ByteArrayContent abstraction for this. (Related SO topic) 而不是手动编写请求的流
- 为了手动设置 cookie,您必须 turn-off 默认行为。您可以通过 HttpClientHandler's UseCookies. (Related SO topic)
- 要手动设置 headers,您可以使用 HttpClient's DefaultRequestHeaders (Related SO topic)
GetResponse
对应的是 SendAsync- 您可以使用 HttpContent's ReadAsStringAsync (Related SO topic) 而不是手动读取响应流
UPDATE: 包含 OP 的修改代码
var content = new StringContent(postData, Encoding.UTF8, "text/x-gwt-rpc");
因此,使用 StringContent 而不是 ByteArrayContent
。