使用 POST 方法将 HttpWebRequest 转换为 HttpClient

Posted

技术标签:

【中文标题】使用 POST 方法将 HttpWebRequest 转换为 HttpClient【英文标题】:Convert HttpWebRequest to HttpClient with POST method 【发布时间】:2020-10-17 11:17:04 【问题描述】:

我尝试将 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();

【问题讨论】:

你能详细说明一下“没有成功”是什么意思吗? 【参考方案1】:

我认为您可以将基于 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 抽象来代替手动编写请求的流。 (Related SO topic) 要手动设置 cookie,您必须关闭默认行为。您可以通过HttpClientHandler's UseCookies 执行此操作。 (Related SO topic) 要手动设置标题,您可以使用HttpClient's DefaultRequestHeaders (Related SO topic) GetResponse 的对应物是SendAsync 您可以使用HttpContent's ReadAsStringAsync (Related SO topic) 代替手动读取响应流

更新:包括 OP 的修改代码

var content = new StringContent(postData, Encoding.UTF8, "text/x-gwt-rpc");

因此,使用 ByteArrayContent 而不是 StringContent。

【讨论】:

因为 header Content-Type 有问题,我不得不更改 requestMessage.Content。这样就可以了: requestMessage.Content = new StringContent(postData, Encoding.UTF8, "text/x-gwt-rpc"); @Wojciech 我已更新我的答案以包含您的评论。

以上是关于使用 POST 方法将 HttpWebRequest 转换为 HttpClient的主要内容,如果未能解决你的问题,请参考以下文章

使用 POST 方法将 HttpWebRequest 转换为 HttpClient

使用 AsyncTask 和 POST 方法将变量发送到服务器并返回 JSON 对象

将json参数发布到api使用post方法Swift 3

使用POST方法将数据从表单插入mysql

将雪花数据发送到 REST API (POST) 的方法

Laravel:使用 POST 请求将数据发送到控制器方法