使用 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());
}