使用 HttpClient.SendAsync() 时发送 PARAMS 的正确方法是什么?
What's the correct way to send PARAMS when using HttpClient.SendAsync()?
我有一个正在使用远程 API 的应用程序。 API 要求我在接受有效请求之前发送 PARAMS。目前我通过 API 调用的 Body
发送 x-www-form-urlencoded
值。
错误的方式:
我不想在 Body
中发送它,而是将其作为 Params
发送。我只是想将它添加到 URL 的末尾以“修复它”并继续,但是,我觉得这可能是更好的方法吗?将所有特殊字符转换为 URL 友好字符(例如 @
字符转换为 %40
)的东西。
正确的方法:
是否有将参数添加到请求的正确方法,或者您只是将它们扔到请求的末尾 URL(URL 端点)?
根据我的经验,除了将值附加到请求字符串的末尾之外,我还没有看到任何 built-in 处理查询参数的方法。
如果需要保证传入的字符串是URL-friendly,直接通过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());
}
我有一个正在使用远程 API 的应用程序。 API 要求我在接受有效请求之前发送 PARAMS。目前我通过 API 调用的 Body
发送 x-www-form-urlencoded
值。
错误的方式:
我不想在 Body
中发送它,而是将其作为 Params
发送。我只是想将它添加到 URL 的末尾以“修复它”并继续,但是,我觉得这可能是更好的方法吗?将所有特殊字符转换为 URL 友好字符(例如 @
字符转换为 %40
)的东西。
正确的方法:
是否有将参数添加到请求的正确方法,或者您只是将它们扔到请求的末尾 URL(URL 端点)?
根据我的经验,除了将值附加到请求字符串的末尾之外,我还没有看到任何 built-in 处理查询参数的方法。
如果需要保证传入的字符串是URL-friendly,直接通过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());
}