Как я могу добавить строку запроса в HttpClient.BaseAdress в c #? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь передать строку запроса в BaseAddress, но он не распознает кавычку "?".

Цитата ломает URI

Сначала я создаю свой BaseAddress

httpClient.BaseAddress = new Uri($"https://api.openweathermap.org/data/2.5/weather?appid={Key}/"); 

Затем я вызываю метод GetAsync, пытаясь добавить еще один параметр

using (var response = await ApiHelper.httpClient.GetAsync("&q=mexico"))....

Это URI, который вызывает код

https://api.openweathermap.org/data/2.5/&q=mexico

1 Ответ

2 голосов
/ 07 июня 2019

Я хотел бы использовать DelegatingHandler, если вам нужно применять ключ API к каждому отдельному запросу:

private class KeyHandler : DelegatingHandler
{
    private readonly string _escapedKey;

    public KeyHandler(string key)  : this(new HttpClientHandler(), key)
    {
    }

    public KeyHandler(HttpMessageHandler innerHandler, string key) : base(innerHandler)
    {
        // escape the key since it might contain invalid characters
        _escapedKey = Uri.EscapeDataString(key);
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // we'll use the UriBuilder to parse and modify the url
        var uriBuilder = new UriBuilder(request.RequestUri);

        // when the query string is empty, we simply want to set the appid query parameter
        if (string.IsNullOrEmpty(uriBuilder.Query))
        {
            uriBuilder.Query = $"appid={_escapedKey}";
        }
        // otherwise we want to append it
        else
        {
            uriBuilder.Query = $"{uriBuilder.Query}&appid={_escapedKey}";
        }
        // replace the uri in the request object
        request.RequestUri = uriBuilder.Uri;
        // make the request as normal
        return base.SendAsync(request, cancellationToken);
    }
}

Использование:

httpClient = new HttpClient(new KeyHandler(Key));
httpClient.BaseAddress = new Uri($"https://api.openweathermap.org/data/2.5/weather"); 

// since the logic of adding/appending the appid is done based on what's in
// the query string, you can simply write `?q=mexico` here, instead of `&q=mexico`
using (var response = await ApiHelper.httpClient.GetAsync("?q=mexico"))

** Примечание. Если вы используете ASP.NET Core, вам следует вызвать services.AddHttpClient(), а затем использовать IHttpHandlerFactory, чтобы сгенерировать внутренний обработчик для KeyHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...