簡體   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