我一直在使用AddParameter在我的HTTP请求中包含XML主体:
request.AddParameter(contentType, body, ParameterType.RequestBody);
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不适用于非字符串体.(RestSharp Http.RequestBody由于某种原因是一个字符串.)我尝试使用AddFile(),但我找不到任何方法来避免将"文件"编码为multipart/form,即使我只提供了一个对象.
我完全不反对解决这个问题的反思,但我希望避免修改源只是为了在HTTP请求中发送任意数据.
编辑:关于我要发送的请求,它们看起来像这样:
PUT ... HTTP/1.1
Accept: application/vnd...
Authorization: Basic ...
Content-Type: application/octet-stream
<arbitrary bytes>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想使用相同的调用来发送不同的内容类型:
PUT ... HTTP/1.1
Accept: application/vnd...
Authorization: Basic ...
Content-Type: application/vnd...
<other arbitrary bytes>
Run Code Online (Sandbox Code Playgroud)
小智 8
在最新版本中进行了一些修改,允许在不创建多部分表单请求的情况下使用单个文件.这是一个显示和示例的要点:
https://gist.github.com/hallem/5faaa6bebde50641e928
我遇到了同样的问题.我必须上传一个文件并使用特定的内容类型与REST接口进行通信.您可以将Http.RequestBody修改为byte [](及其所有依赖项),但我认为这样更容易:
我修改了RestSharp,这样当文件数> 1或文件数= 1时,它只使用Multipart Encoding,并且还有正文或其他帖子数据集.
你必须修改288行的Http.cs
if(HasFiles)
Run Code Online (Sandbox Code Playgroud)
至
if(Files.Count > 1 || (Files.Count == 1 && (HasBody || Parameters.Any())))
Run Code Online (Sandbox Code Playgroud)
对于Http.Sync.cs,修改PreparePostData
private void PreparePostData(HttpWebRequest webRequest)
{
if (HasFiles)
{
webRequest.ContentType = GetMultipartFormContentType();
using (var requestStream = webRequest.GetRequestStream())
{
WriteMultipartFormData(requestStream);
}
}
PreparePostBody(webRequest);
}
Run Code Online (Sandbox Code Playgroud)
至
private void PreparePostData(HttpWebRequest webRequest)
{
// Multiple Files or 1 file and body and / or parameters
if (Files.Count > 1 || (Files.Count == 1 && (HasBody || Parameters.Any())))
{
webRequest.ContentType = GetMultipartFormContentType();
using (var requestStream = webRequest.GetRequestStream())
{
WriteMultipartFormData(requestStream);
}
}
else if (Files.Count == 1)
{
using (var requestStream = webRequest.GetRequestStream())
{
Files.Single().Writer(requestStream);
}
}
PreparePostBody(webRequest);
}
Run Code Online (Sandbox Code Playgroud)
如果使用异步版本,则必须在Http.Async.cs中修改与上面类似的代码.
现在你可以像这样使用RestSharp
IRestRequest request = new RestRequest("urlpath", Method.PUT);
request.AddHeader("Content-Type", "application/zip");
request.AddFile("Testfile", "C:\\File.zip");
Client.Execute(request);
Run Code Online (Sandbox Code Playgroud)
AddFile还提供了一个重载,用于设置直接byte []数据而不是路径.希望有所帮助.
小智 5
在编写本文时的最新版本的RestSharp(版本104)中,修改需要在Http.Sync.cs中,方法PreparePostData,它应该读作:
private void PreparePostData(HttpWebRequest webRequest)
{
// Multiple Files or 1 file and body and / or parameters
if (Files.Count > 1 || (Files.Count == 1 && (HasBody || Parameters.Count>0)))
{
webRequest.ContentType = GetMultipartFormContentType();
using (var requestStream = webRequest.GetRequestStream())
{
WriteMultipartFormData(requestStream);
}
}
else if (Files.Count == 1)
{
using (var requestStream = webRequest.GetRequestStream())
{
Files[0].Writer(requestStream);
}
}
PreparePostBody(webRequest);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18691 次 |
| 最近记录: |