![](/img/trans.png)
[英]Best way to pass List in query string HttpClient.GetAsync()
[英]HttpClient.GetAsync() selectively ignoring query parameter
我有一个非常简单的方法来查询网页并解析结果。 响应的正文不是问题,问题在于GetAsync(string)
或GetAsync(Uri)
方法生成的请求似乎选择性地忽略了某个查询参数。 我说它是选择性地忽略它,因为无论它们出现的顺序如何,它都会忽略相同的参数。
当我检查返回的HttpResponseMessage
的RequestMessage
属性时, RequestUri
正确显示了完整的 uri,只是它缺少非常具体的“o=data”参数,并且响应正文确认请求中不存在该参数,因为如果内容存在(但不存在),则应按日期对内容进行排序。
static readonly HttpClient client = new() { BaseAddress = new("https://www.jusbrasil.com.br/diarios/busca") };
public static async Task<ResultDocument[]> GetResults(string name)
{
var query = new Uri($"https://www.jusbrasil.com.br/diarios/busca?q={Uri.EscapeDataString(name)}&o=data");
//var query = "?q={name}&o=data" the exact same problem happens whether I use BaseAddress or not.
var resp = await client.GetAsync(query);
// Rest of the function parsing the result's body.
}
更新:我试图重命名参数。
如果参数命名为“w”,它会起作用,如果参数命名为“or”,它就会起作用。
只有当它具有名称“o”(这是我需要的)时它才会消失。
不工作。 如果name
包含空格字符,则任何其他参数都会消失。
更新:原来问题只发生在name
有空格字符时。 就算逃了。 代码已更新。
当“o”消失时显示name.ToCharArray()
。 (这里的方法是直接从 Program.cs 调用的):
更新:似乎问题可能出在默认的HttpMessageHandler
。 当我实现自定义处理程序只是为了查看HttpClient
如何生成HttpRequestMessage
时,请求中的RequestUri
是正确的。 还要注意,这里的空格字符显示为"%20"
而不是'+'
转义,这是应该的,因为Uri.EscapeDataString(string)
用"%20"
而不是'+'
转义它。
在@Dai 的大力帮助下,我们终于找到了问题所在。 如果name
中的空格字符用%20
转义,则服务器以重定向响应,并且重定向目标忽略其他参数。 事实证明问题出在服务器上,而不是代码上。
为了解决这个问题,我只是改变了这一行:
var query = new Uri($"https://www.jusbrasil.com.br/diarios/busca?q={Uri.EscapeDataString(name)}&o=data");
至:
var query = new Uri($"https://www.jusbrasil.com.br/diarios/busca?q={Uri.EscapeDataString(name).Replace("%20", "+")}&o=data");
我离开了Uri.EscapeDataString(string)
并且只替换了%20
因为用%xx
转义的其他字符(例如双引号%22
)仍然可以正常工作并且不会导致重定向错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.