如何使用RestSharp访问HTTP请求主体?

26

我正在使用C# .NET 3.5构建一个RESTful API客户端。

一开始,我使用传统的HttpWebClient(和HttpWebResponse)构建它,我能够随心所欲地做任何事情。我很高兴。唯一让我困扰的是自动反序列化JSON响应。

后来,我听说有一个名为RestSharp(104.1)的神奇库,可以简化RESTful API客户端的开发,并自动反序列化JSON和XML响应。我把所有的代码都切换到了它上面,但现在我意识到我不能像使用HttpWebClientHttpWebResponse那样做一些事情,比如访问和编辑原始请求正文。

有人有解决办法吗?

编辑:我知道如何设置请求正文(使用request.AddBody()),我的问题是我想获取这个请求正文字符串,编辑它,并重新设置它在请求中(换句话说:实时更新请求正文)

1个回答

60
请求正文是一种参数类型。要添加一个,可以执行以下操作之一...
req.AddBody(body);
req.AddBody(body, xmlNamespace);
req.AddParameter("text/xml", body, ParameterType.RequestBody);
req.AddParameter("application/json", body, ParameterType.RequestBody);

要检索body参数,您可以查找req.Parameters集合中Type等于ParameterType.RequestBody的项。
请参阅RestRequesthere的代码。
这是RestSharp关于ParameterType.RequestBody的文档:
如果设置了此参数,则其值将作为请求的正文发送。忽略参数的名称和额外的RequestBody参数 - 只接受1个。
RequestBody仅适用于POST或PUT请求,因为只有它们实际上发送了正文。
如果还有GetOrPost参数,则它们将覆盖RequestBody - RestSharp不会将它们组合在一起,而是会放弃RequestBody参数。
要动态读取/更新body参数,可以尝试:
var body = req.Parameters.FirstOrDefault(p => p.Type == ParameterType.RequestBody);
if (body != null)
{
    Console.WriteLine("CurrentBody={0}", body.Value);
    body.Value = "NewBodyValue";
}

如果无法实现,可以创建一个新的 RestRequest 对象并使用不同的 body。


1
太棒了,谢谢!这是完整的工作代码:http://pastebin.com/0c4bqPNW - Epoc
4
在这里,你可以用.FirstOrDefault([lambda])来替代.Where([lambda]).FirstOrDefault() - Phate01
2
如果您想要JSON:req.JsonSerializer.Serialize(request.Parameters[1]) - Maxence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接