如何在添加文件后但在发送之前获得RestRequest正文内容

本文关键字:RestRequest 正文 添加 文件 | 更新日期: 2023-09-27 18:11:23

我正在调用一个API,它需要请求报头中请求体的MD5哈希值。

我正在使用RestSharp发送请求。通常我可以检查请求。Body参数的参数,并在调用Execute之前散列该参数的值。

虽然,在调用AddFile之后,body参数为空,并且在发送请求之前准备好内容之前保持为空。(因为文件是分开存储的)

在多部分字符串生成后,但在发送请求之前,是否有办法读取RestRequest的正文内容,以便我可以将MD5哈希值添加到请求的标头?

如何在添加文件后但在发送之前获得RestRequest正文内容

我意识到这是一个老问题,但我认为库通过允许您在发送请求之前访问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名称空间来进行独立的序列化。