如何在添加文件后但在发送之前获得RestRequest正文内容
本文关键字:RestRequest 正文 添加 文件 | 更新日期: 2023-09-27 18:11:23
我正在调用一个API,它需要请求报头中请求体的MD5哈希值。
我正在使用RestSharp发送请求。通常我可以检查请求。Body参数的参数,并在调用Execute之前散列该参数的值。
虽然,在调用AddFile之后,body参数为空,并且在发送请求之前准备好内容之前保持为空。(因为文件是分开存储的)
在多部分字符串生成后,但在发送请求之前,是否有办法读取RestRequest的正文内容,以便我可以将MD5哈希值添加到请求的标头?
我意识到这是一个老问题,但我认为库通过允许您在发送请求之前访问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)
});
}
从我所做的额外研究来看,目前似乎没有一种方法可以实现我使用默认API所追求的功能。
我最终下载了源代码,并向Http类添加了一个事件处理程序,现在在HttpWebRequest发送之前触发。我在事件处理程序的参数中发送HttpWebRequest,然后一直到RestClient。
然后我可以在顶层代码中拦截请求,并在请求发送之前按我的喜好添加标题。
这可能不是最有效的修改,但它在单元测试中工作得很好。
不幸的是,如果向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名称空间来进行独立的序列化。