首页 > 解决方案 > RestSharp:使用 request.AddJsonBody() 命名参数?

问题描述

当我使用该方法时,如何命名添加到请求中的多部分/表单数据AddJsonBody()

我试图超越过时的AddParameter()方法。

这是我使用该AddJsonBody()方法的代码:

request.AddJsonBody(Metadata);

有一个重载允许我指定 Content-Type,但我只需要普通的旧的application/json,所以我不使用它。以下是我发送的 HTTP 请求的相关部分:

POST https://redacted/redacted HTTP/1.1
Content-Type: multipart/form-data; boundary=---------369C5A1F-30CF-450D-A5B4-2DBD93676056

-----------369C5A1F-30CF-450D-A5B4-2DBD93676056
Content-Type: application/json
Content-Disposition: form-data; name="application/json"

{"Date":"2021-07-28T14:27:01.0718841","FurtherInfo":"This is a metadata test."}
-----------369C5A1F-30CF-450D-A5B4-2DBD93676056
Content-Disposition: form-data; name="file"; filename="file20210728T1427010660244Z.txt"
Content-Type: text/plain

CL7~f`lz4ULMJa;]p-q!uH(-z*4iO'SHD)KYER5SI|e{3zW7^}J,%QPyD)$\K"
[...]
-----------369C5A1F-30CF-450D-A5B4-2DBD93676056--

如您所见,添加参数的“名称”是application/json. 我希望它是“元数据”。因此,我正在使用此代码以我想要的方式发送内容,但此代码被标记为已过时:

Parameter metadata = new Parameter("metadata", JsonConvert.SerializeObject(Metadata), "application/json", ParameterType.RequestBody);
request.AddParameter(metadata);

使用它会将 HTTP 请求更改为:

POST https://redacted/redacted HTTP/1.1
Content-Type: multipart/form-data; boundary=---------8C24DE69-C111-418A-9C29-5D9DFABA320F

-----------8C24DE69-C111-418A-9C29-5D9DFABA320F
Content-Type: application/json
Content-Disposition: form-data; name="metadata"

{
  "date": "2021-07-28T14:45:01.4650889",
  "furtherInfo": "This is a metadata test."
}
-----------8C24DE69-C111-418A-9C29-5D9DFABA320F
Content-Disposition: form-data; name="file"; filename="file20210728T1445014611849Z.txt"
Content-Type: text/plain

zoRC)Z:c]\<#/z_q,k
[...]
-----------8C24DE69-C111-418A-9C29-5D9DFABA320F--

具体的序列化无关紧要,只是它是有效的 JSON 并且具有 name metadata

有没有办法使用更新的AddJsonBody()方法来做到这一点?是否在路线图上操纵参数名称?

标签: jsonrestsharp

解决方案


据我了解,您正在尝试发送文件?这是一个使用 RestSharp 将文件发送到 API 的示例


using (WindowsIdentity.GetCurrent().Impersonate())
    {
        RestClient client = new RestClient(url);
        var request = new RestRequest("/api/Upload", Method.POST, DataFormat.Json);
        request.AddHeader("Cache-Control", "no-cache");
        request.AlwaysMultipartFormData = true;
        request.UseDefaultCredentials = true;
        request.AddHeader("Content-Type", "multipart/form-data");
        request.AddParameter("ServiceID", ServiceID, ParameterType.QueryString);
        request.AddParameter("Description", description, ParameterType.QueryString);

        //get byte[] , in reallife would be a stream
        byte[] fileData = File.ReadAllBytes($@"C:\1\TEST\{filename}");
        request.AddFileBytes("DocumentFile", fileData, filename, "multipart/form-data");

        var result = client.Execute(request).Dump();
    }


推荐阅读