.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();
}
顺便说一句,您可以使用一些技巧:
- 你可以删除那些
AddDDApiKey()
AddDDApplicationKey()
如果您将 _httpClient
配置为在它发送的所有请求中包含一些 headers,则调用 MetricAggregateAsync
(以及使用此 API 的所有其他方法),例如:
_httpClient.DefaultRequestHeaders.Add("DD-API-KEY", "TODO");
_httpClient.DefaultRequestHeaders.Add("DD-APPLICATION-KEY", "TODO");
这应该在实例化 _httpClient
的同一位置完成(而不是在 MetricAggregateAsync
中)。
- 构建 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}";
我使用 .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();
}
顺便说一句,您可以使用一些技巧:
- 你可以删除那些
如果您将AddDDApiKey() AddDDApplicationKey()
_httpClient
配置为在它发送的所有请求中包含一些 headers,则调用MetricAggregateAsync
(以及使用此 API 的所有其他方法),例如:
这应该在实例化_httpClient.DefaultRequestHeaders.Add("DD-API-KEY", "TODO"); _httpClient.DefaultRequestHeaders.Add("DD-APPLICATION-KEY", "TODO");
_httpClient
的同一位置完成(而不是在MetricAggregateAsync
中)。 - 构建 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}";