#c# #asp.net #asp.net-web-api #restsharp
#c# #asp.net #asp.net-web-api #restsharp
Вопрос:
Я вызываю API, которому требуется хэш MD5 тела запроса в заголовке запроса.
Я использую RestSharp для отправки запросов. Обычно я могу проверить запрос.Задайте параметры для параметра Body и хэшируйте значение параметра перед вызовом Execute.
Хотя после вызова addFile параметр body пуст и, похоже, остается пустым до тех пор, пока содержимое не будет подготовлено перед отправкой запроса. (Поскольку файлы хранятся отдельно)
Можно ли как-нибудь прочитать содержимое тела RestRequest после того, как была сгенерирована составная строка, но до отправки запроса, чтобы я мог добавить хэш MD5 в заголовок запроса?
Ответ №1:
Я понимаю, что это старый вопрос, но я думаю, что библиотека справится с этим за вас, разрешив вам доступ к Http
объекту перед отправкой запроса.
var client = new RestSharp.RestClient();
var request = new RestRequest();
request.OnBeforeRequest = (http) => {
http.Headers.Add(new HttpHeader {
Name = "CONTENT_MD5",
Value = GenerateMd5Hash(x.RequestBody)
});
}
Комментарии:
1. Не удается разрешить символ ‘onBeforeRequest’
Ответ №2:
Из дополнительных исследований, которые я провел, выясняется, что на данный момент нет способа достичь функциональности, к которой я стремился, с помощью API по умолчанию.
В итоге я загрузил исходный код и добавил обработчик событий в Http-класс, который теперь запускается перед отправкой HttpWebRequest. Я отправляю HttpWebRequest в параметрах обработчика событий, который затем загружается вплоть до RestClient.
Затем я могу перехватить запрос в коде верхнего уровня и добавить в заголовки, как мне заблагорассудится, перед отправкой запроса.
Вероятно, это не самая эффективная модификация, но она работает достаточно хорошо для модульных тестов.
Ответ №3:
К сожалению, RestSharp естественным образом не предоставляет сериализованное тело запроса, если вы передаете ему объект. Например:
restRequest.AddXmlBody(myObject);
Но можно получить исходный запрос, в основном воссоздав тот же сериализатор, который использует RestSharp, а затем сериализовав его самостоятельно. В качестве примера, допустим, вы используете restClient.UseDotNetXmlSerializer()
, вы могли бы:
var dotNetXmlSerializer = new DotNetXmlSerializer();
var requestSerializer = new XmlRestSerializer().WithXmlSerializer(dotNetXmlSerializer);
Это просто урезанная версия того, что есть в исходном коде RestSharp для UseDotNetXmlSerializer()
. Затем вы просто вызываете это, чтобы получить необработанное тело запроса:
var xmlRequestBody = requestSerializer.Serialize(myObject);
Этот код может быть помещен в любое место, к которому есть доступ myObject
, и не зависит от вашего restClient
. По сути, то, что вы делаете, — это использование пространств имен RestSharp для выполнения независимой сериализации.