У меня возникли проблемы с пониманием того, как передавать закодированные данные в запросе с помощью flurl. У нас есть API, который выглядит так:
https://servicename.com/domain/api/{identifier}?parameter=value
И в некоторых конкретных случаях у нас есть идентификаторы, которые содержат косую черту /
Мы создаем запрос, используя следующий код:
var clientRequest = this.configuration.Client
.Request(this.configuration.RequestPath)
.AppendPathSegment(identifier)
.WithHeader("Requesting-System", "api");
И мы вызываем это, используя:
using (var response = await clientRequest.GetAsync(cancellationToken))
{
return await response.Content.ReadAsStringAsync();
}
В настоящее время. Используя простой подход, просто передавайте идентификатор с косой чертой; скажем, abc/123. Приведенный выше код генерирует clientRequest с путем
https://servicename.com/domain/api/abc/123?parameter=value
Что, как и следовало ожидать, завершается с ошибкой 400. Таким образом, решение для этого, основанное на наших спецификациях API, состоит в том, чтобы закодировать косую черту как %2F и передать ее в URL-адресе. К счастью, Flurl делает это довольно легко в теории, разрешая необязательный параметр в методе AppendPathSegment, который вызовет кодирование. Поэтому мы исправляем вышеизложенное, чтобы использовать
.AppendPathSegment(identifier, true)
Который генерирует clientRequest с путем
https://servicename.com/domain/api/abc%2F123?parameter=value
Именно то, что я ожидал увидеть. Если я вызову этот URL-адрес с помощью почтальона, я увижу правильный ответ, который я ожидаю от API.
Однако, когда я вызываю его с помощью метода GetAsync (такого же, как указано выше), я все равно получаю ошибку 400 Sub-Resource notcognized; и в моих журналах я вижу, что фактический запрос был сделан для
https://servicename.com/domain/api/abc/123?parameter=value
Есть ли во время вызова службы момент, когда Flurl декодирует строку URL? Если да, то как передать %2F?
Пробовали двойное кодирование, чтобы запрос содержал идентификатор abc%252F123. Учитывая вышесказанное, я ожидал, что это будет декодировано в abc%2F123, которое затем будет отправлено в наш API. Но в этом случае декодирование не происходит, и URL-адрес запроса
https://servicename.com/domain/api/abc%252F123?parameter=value
Заранее большое спасибо за помощь.
HttpRequestMessage
завершается и передаетсяHttpClient
, и может гарантировать, что URL-адрес не закодирован и не закодирован дважды. Сегмент пути в этой точке равенabc%2F123
. - person Todd Menier   schedule 12.10.2018