.NET 6 - 在查询字符串中传递 JSON

.NET 6 - Pass JSON in query string

我使用 .NET 6,我想使用 HttpClient.GetAsync 发送查询。 其中一个参数是 JSON,我不知道如何正确编码它。

这是我使用的文档: https://docs.datadoghq.com/api/latest/metrics/#query-timeseries-points

我试过这个方法,但是我从服务器收到了错误的请求

    public async Task<string> MetricAggregateAsync(string from, string to, string query)
    {
        AddDDApiKey();
        AddDDApplicationKey();

        //var content = new StringContent(json, Encoding.UTF8, "application/json");
        //System.Web.Helpers.Json.Encore(query);

        query = System.Web.HttpUtility.UrlEncode(query);

        string content = "?from=" + from +"&to=" + to + "&query=" + query;

        HttpResponseMessage response = await _httpClient.GetAsync("v1/query" + content);

        response.EnsureSuccessStatusCode();

        return await response.Content.ReadAsStringAsync();
    }

根据您共享的文档(感谢!),这个 GET /query 端点似乎根本不需要 JSON 内容。试试这个版本的代码:

public async Task<string> MetricAggregateAsync(string from, string to, string query)
{
    AddDDApiKey();
    AddDDApplicationKey();

    query = System.Web.HttpUtility.UrlEncode(query);

    string url = $"v1/query?from={from}&to={to}&query={query}";

    HttpResponseMessage response = await _httpClient.GetAsync(url);

    response.EnsureSuccessStatusCode();

    return await response.Content.ReadAsStringAsync();
}

顺便说一句,您可以使用一些技巧:

  1. 你可以删除那些
    AddDDApiKey()
    AddDDApplicationKey()
    
    如果您将 _httpClient 配置为在它发送的所有请求中包含一些 headers,则调用 MetricAggregateAsync(以及使用此 API 的所有其他方法),例如:
    _httpClient.DefaultRequestHeaders.Add("DD-API-KEY", "TODO");
    _httpClient.DefaultRequestHeaders.Add("DD-APPLICATION-KEY", "TODO");
    
    这应该在实例化 _httpClient 的同一位置完成(而不是在 MetricAggregateAsync 中)。
  2. 构建 URL 字符串的更安全方法是替换
    query = System.Web.HttpUtility.UrlEncode(query);
    
    string url = $"v1/query?from={from}&to={to}&query={query}";
    
    var urlParameters = System.Web.HttpUtility.ParseQueryString(""); // Strange way to start, but please bear with it :)
    urlParameters.Add("from",  from);
    urlParameters.Add("to",    to);
    urlParameters.Add("query", query); // Automatically encodes URL, so you don't have to do it manually
    
    string url = $"v1/query?{urlParameters}";