У меня есть приложение, использующее удаленный API. Этот API требует, чтобы я отправил PARAMS, прежде чем он примет запрос как действительный. В настоящее время я отправляю x-www-form-urlencoded
значения через Body
вызова API.
Я хочу НЕ отправлять его в Body
, а вместо этого отправить как Params
. Я просто собирался добавить это в конец URL-адреса, чтобы «исправить это» и двигаться дальше, но я чувствую, что это лучший способ сделать это, может быть? Что-то, что объясняет преобразование всех специальных символов в символы, удобные для URL (например, символ @
в %40
).
Есть ли правильный способ добавления параметров в запрос или вы просто добавляете их в конец URL-адреса запроса (конечная точка URL-адреса)?
По своему опыту я не видел никаких встроенных способов обработки параметров запроса, кроме добавления значений в конец строки запроса.
Если вам нужно убедиться, что передаваемые строки подходят для URL, просто передайте их через HttpUtlity.UrlEncode(string)
Пример:
public async Task SendToApi(string param1, string param2)
{
string requestUrl = HttpUtility.UrlEncode(
$"https://your.api.com/api?x = {param1}&y = {param2}"
)
await _httpClient.SendAsync(requestUrl);
}
Если вы собираетесь сделать это для нескольких вызовов с разными параметрами строки запроса, вы можете сделать что-то вроде этого:
private static string GetQueryString(object obj)
{
var objectAsJsonString = JsonSerializer.Serialize(obj);
var objectAsDictionary = JsonSerializer.Deserialize<IDictionary<string, object>>(objectAsJsonString);
if (objectAsDictionary == null)
throw new Exception($"Unable to deserialize json to query string. Json: {objectAsJsonString}");
var objectAsListOfProperties = objectAsDictionary
.Select(x => $"{GetUrlEncodedValue(x.Key)} = {GetUrlEncodedValue(x.Value.ToString())}")
.ToList();
return string.Join("&", objectAsListOfProperties);
}
private static string GetUrlEncodedValue(object value)
{
if (value is DateTime dt)
return HttpUtility.UrlEncode(dt.ToString("O"));
return HttpUtility.UrlEncode(value.ToString());
}