RestSharp:使用 request.AddJsonBody() 命名参数?
RestSharp: Naming the parameter using request.AddJsonBody()?
当我使用 AddJsonBody()
方法时,如何命名添加到请求中的 multipart/form-data 片段?
我正试图通过过时的 AddParameter()
方法。
这是我使用 AddJsonBody()
方法的代码:
request.AddJsonBody(Metadata);
有一个允许我指定内容类型的重载,但我只需要普通的旧 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 并且名称为 metadata
.
有没有办法使用较新的 AddJsonBody()
方法来做到这一点?正在操纵路线图上的参数名称?
据我了解,您正在尝试发送文件?
这是一个使用 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:\TEST\{filename}");
request.AddFileBytes("DocumentFile", fileData, filename, "multipart/form-data");
var result = client.Execute(request).Dump();
}
找到了!
来自the class definition of RestRequest:
public IRestRequest AddParameter(string name, object value, string contentType, ParameterType type)
我可以直接添加参数而不是创建参数:
request.AddParameter("metadata", JsonConvert.SerializeObject(Metadata), "application/json", ParameterType.RequestBody);
不再有过时的警告!
当我使用 AddJsonBody()
方法时,如何命名添加到请求中的 multipart/form-data 片段?
我正试图通过过时的 AddParameter()
方法。
这是我使用 AddJsonBody()
方法的代码:
request.AddJsonBody(Metadata);
有一个允许我指定内容类型的重载,但我只需要普通的旧 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 并且名称为 metadata
.
有没有办法使用较新的 AddJsonBody()
方法来做到这一点?正在操纵路线图上的参数名称?
据我了解,您正在尝试发送文件? 这是一个使用 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:\TEST\{filename}");
request.AddFileBytes("DocumentFile", fileData, filename, "multipart/form-data");
var result = client.Execute(request).Dump();
}
找到了!
来自the class definition of RestRequest:
public IRestRequest AddParameter(string name, object value, string contentType, ParameterType type)
我可以直接添加参数而不是创建参数:
request.AddParameter("metadata", JsonConvert.SerializeObject(Metadata), "application/json", ParameterType.RequestBody);
不再有过时的警告!