FormUrlEncodedContent 和查询字符串有啥区别?

Posted

技术标签:

【中文标题】FormUrlEncodedContent 和查询字符串有啥区别?【英文标题】:What is the difference between FormUrlEncodedContent and query string?FormUrlEncodedContent 和查询字符串有什么区别? 【发布时间】:2018-08-04 19:14:30 【问题描述】:

我正在使用以下方法进行网络抓取

这对大多数网站来说都是成功的。

var content = new FormUrlEncodedContent(new[]

    new KeyValuePair<string, string>("v1", "value1"),
    new KeyValuePair<string, string>("v2", "value2"),
    new KeyValuePair<string, string>("v3", "value3"),
);
var response = await client.PostAsync("http://url.com", content);
html = await response.Content.ReadAsStringAsync();

有时某些网站需要这种方式来获得响应。

var url = "http://url.com?v1=value1&v2=value2&v3=value3";
var response = await client.PostAsync(url, null);
html = await response.Content.ReadAsStringAsync();

有时需要这样才能得到响应。

var query = "v1=value1&v2=value2&v3=value3";
var content = new ByteArrayContent(Encoding.UTF8.GetBytes(query));
var response = await client.PostAsync("http://url.com", content);
html = await response.Content.ReadAsStringAsync();

我真的不知道有什么区别。

【问题讨论】:

【参考方案1】:

如果您使用FormUrlEncodedContent,您的参数将在请求正文中发送并格式化为查询字符串。

POST http://url.com/ HTTP/1.1
Host: url.com
Content-Length: 29
Expect: 100-continue
Connection: Keep-Alive

v1=value1&v2=value2&v3=value3 

在第二种情况下,参数将作为 URL 的查询部分发送。

POST http://url.com/?v1=value1&v2=value2&v3=value3 HTTP/1.1
Host: url.com
Content-Length: 0 

在第三种情况下,您在请求正文中发送了 query 的内容。

在您的示例中,它与第一种情况具有相同的效果,但您手动进行了格式化。

【讨论】:

是说服务器只接受请求体还是只接受url参数? 是的@derodevil,这取决于服务器如何处理请求。在一种情况下,它希望从请求正文中获取参数,在另一种情况下,从 URL 的查询部分获取参数。【参考方案2】:

URL(查询字符串)有一个(取决于浏览器的)大小限制。 POST 请求的正文没有此限制。因此,您将使用正文发送文件。

另一方面,可以在链接中使用 URL。

【讨论】:

【参考方案3】:
    您正在发送一个 POST 请求,请求正文中包含 application/x-www-form-urlencoded 负载 你应该发送一个POST请求,没有负载,但它仍然有效,因为端点可能接受查询字符串作为负载,就像GET一样请求(而不是请求正文) 您正在向需要字节数组有效负载的资源发送 POST

【讨论】:

以上是关于FormUrlEncodedContent 和查询字符串有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient实现POST参数提交

HttpClient 无法访问登录页面后面的页面

带有其他参数的 C# HttpClient Post 字符串数组

在c#中使用httpclienthandler使用一个参数发布多个值

DataFrame查询2 - 专用查询:索引和切片

Elasticsearch中的Term查询和全文查询