RestSharp可以在不使用多部分内容类型的情况下发送二进制数据吗?

lad*_*dge 10 c# restsharp

我一直在使用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

  • 对于那些像我一样跳过这个答案的人,因为它说的是"文件":它不一定是文件.关键特性是,如果你添加`request.AddParameter("application/pdf",documentBytes,ParameterType.RequestBody)``和`documentBytes`是`byte []`,那么这些字节将直接作为指定`Content-Type`(这里是`application/pdf`). (3认同)

Dre*_*sel 5

我遇到了同样的问题.我必须上传一个文件并使用特定的内容类型与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)