FormUrlEncodedContent和查询字符串有什么区别?

时间:2018-08-04 19:14:30

标签: c# httpclient

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

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

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();

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

3 个答案:

答案 0 :(得分:2)

如果您使用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的内容。

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

答案 1 :(得分:0)

URL(查询字符串)的大小限制(与浏览器相关)。 POST请求的主体没有此限制。因此,您可以使用正文来发送文件。

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

答案 2 :(得分:0)

  1. 您正在通过请求正文中的POST有效负载发送一个application/x-www-form-urlencoded请求
  2. 应该发送一个POST请求,没有有效载荷,但是它仍然有效,因为端点大概接受查询字符串作为有效载荷,就像{ {1}}个请求(而不是请求正文)
  3. 您要向需要字节数组有效负载的资源发送GET

高度