У меня есть метод, который выглядит как

public Task<HttpResponseMessage> GetLocationResponse(string url, string countryName = "The Netherlands", string cityName = "The Hague"))
{
    var httpClient = new HttpClient();
    var query = HttpUtility.ParseQueryString(string.Empty);
    query["countryName"] = HttpUtility.UrlPathEncode(countryName); // The%20Netherlands
    query["cityName"] = HttpUtility.UrlPathEncode(cityName); // The%20Hague
    var uriBuilder = new UriBuilder(url);
    uriBuilder.Query = query.ToString();
    return httpClient.GetAsync(uriBuilder.ToString());
}

Я ожидаю, что клиент обратится к

https://example.com?countryName=The%20Netherlands&cityName=The%20Hague

Вместо этого он обращается к

https://example.com?countryName=The%2520Netherlands&cityName=The%2520Hague

Что неправильно. Если я просто введу cityName и countryName прямо в запрос, например

query["countryName"] = countryName
query["cityName"] = cityName;

Я получил

https://example.com?countryName=The+Netherlands&cityName=The+Hague

Что опять же бесполезно.

Кажется, проблема заключается в

query.ToString()

Потому что он кодирует значения параметров бесполезным образом.

Как я могу заставить его либо не кодировать значения параметров, либо кодировать их так, как я хочу?

c#
1
user15470126 4 Май 2021 в 15:47

1 ответ

Лучший ответ

При работе с задачами, связанными с HttpClient, лучше использовать некоторую ручную библиотеку, такую ​​как RestSharp.

Использование библиотеки RestSharp NuGet (https://www.nuget.org/packages/RestSharp) - Вам не нужно беспокоиться о кодировке URL, парсинге JSON и многом другом

var client = new RestClient("https://countries.com");
var request = new RestRequest("GetCountry", Method.GET);
// As you mentioned, If you do no need to encode URL parameters. Add the encoding off option
request.AddQueryParameter("countryName", "India", ParameterType.QueryStringWithoutEncode);  
request.AddQueryParameter("cityName", "Kochi", ParameterType.QueryStringWithoutEncode);  
var response = client.Execute(request);

Это даст

https://countries.com/GetCountry?countryName=India&cityName=Kochi

Кодирование URL обрабатывается автоматически. Вам не нужно об этом беспокоиться

2
Sangeeth nandakumar 4 Май 2021 в 13:29