Dar*_*iak 0 multipartform-data restsharp flurl asp.net-core freshdesk
我正在尝试使用 Flurl 或 RestSharp 库编写对 Freshdesk API 的调用。
我试图编写的 API 调用是创建票证:https ://developers.freshdesk.com/api/#create_ticket
卷曲的示例:
curl -v -u yourapikey:X -F "attachments[]=@/path/to/attachment1.ext" -F "attachments[]=@/path/to/attachment2.ext" -F "email=example@example.com" -F "subject=Ticket Title" -F "description=this is a sample ticket" -X POST 'https://domain.freshdesk.com/api/v2/tickets'
注意参数是通过-F(即--form)标志传递的。
使用以下代码调用 Flul:
var rs = await url.WithBasicAuth(_configuration.ApiKey, _configuration.Password)
                  .PostMultipartAsync(mp =>
                  {
                      mp.AddString("email", ticket.Email);
                      mp.AddString("subject", ticket.Subject);
                      mp.AddString("status", ticket.Status.ToString());
                      mp.AddString("priority", ticket.Priority.ToString());
                      mp.AddString("description", ticket.Description);
                  });
...或者调用 RestSharp 的以下代码:
var request = new RestRequest("tickets", Method.Post);
request.AlwaysMultipartFormData = true;
request.AddParameter("email", ticket.Email);
request.AddParameter("description", ticket.Description);
request.AddParameter("subject", ticket.Subject);
request.AddParameter("status", ticket.Status);
request.AddParameter("priority", ticket.Priority);
var rs = await client.ExecuteAsync(request);
...我收到 400 BadRequest,其中包含以下信息(在两种情况下):
{
    "description": "Validation failed",
    "errors": [
        {
            "code": "invalid_field",
            "field": "email\r\n",
            "message": "Unexpected/invalid field in request"
        },
        {
            "code": "invalid_field",
            "field": "subject\r\n",
            "message": "Unexpected/invalid field in request"
        },
        {
            "code": "invalid_field",
            "field": "status\r\n",
            "message": "Unexpected/invalid field in request"
        },
        {
            "code": "invalid_field",
            "field": "priority\r\n",
            "message": "Unexpected/invalid field in request"
        },
        {
            "code": "invalid_field",
            "field": "description\r\n",
            "message": "Unexpected/invalid field in request"
        }
    ]
}
注意:
-F/--form作为传递参数的方式。邮递员截图(工作示例):
我尝试使用具有 cURL 侦听器的 Tiny.RestClient,它生成了以下 cURL:
curl -X POST [...] -d "--1c3acb07-77bd-494d-bc56-21290dcd5088
Content-Type: text/plain
Content-Disposition: form-data; name=email
a@a.com
[...]
也许,Furll 和 RestSharp 使用相同的方式来处理参数,从而处理\r\nin 字段。
这是 FreshDesk API 问题。由于某种原因,他们希望将多部分表单数据参数名称括在引号中。这不是 HTTP 标准的要求。RestSharp 和 Flurl 使用MultipartFormDataContent,并且它添加了使用提供的参数名称。
根据您的问题,我将此属性添加到RestRequest:
/// <summary>
/// When set to true, parameters in a multipart form data requests will be enclosed in
/// quotation marks. Default is false. Enable it if the remote endpoint requires parameters
/// to be in quotes (for example, FreshDesk API). 
/// </summary>
public bool MultipartFormQuoteParameters { get; set; }
它在 RS 107.3.0 中可用。
您还可以通过添加如下参数来使其工作:
request.AddParameter("\"status\"", ticket.Status);
| 归档时间: | 
 | 
| 查看次数: | 495 次 | 
| 最近记录: |