繁体   English   中英

HttpClient.GetAsync() 选择性地忽略查询参数

[英]HttpClient.GetAsync() selectively ignoring query parameter

我有一个非常简单的方法来查询网页并解析结果。 响应的正文不是问题,问题在于GetAsync(string)GetAsync(Uri)方法生成的请求似乎选择性地忽略了某个查询参数。 我说它是选择性地忽略它,因为无论它们出现的顺序如何,它都会忽略相同的参数。

当我检查返回的HttpResponseMessageRequestMessage属性时, 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.
        }

具体来说,“o”查询参数从请求中消失了。

更新:我试图重命名参数。 如果参数命名为“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM