【问题标题】:Convert curl command to restsharp将 curl 命令转换为 restsharp
【发布时间】:2017-01-08 11:24:36
【问题描述】:

如何将此 curl 命令转换为 restsharp?

curl -X POST \
--header "Authorization: Bearer SomeToken" \
--header "_Id: SomeId" \    
--data-urlencode 'keys: name, age' \
https://api.SomeDomain.com/object-storage/classes/query/Player

我试过这个:

RestClient client = new RestClient("https://api.SomeDomain.com");
RestRequest request = new RestRequest("/object-storage/classes/query/hotels", Method.POST);
request.AddHeader("_Id", "SomeId");
request.AddHeader("Authorization", "Bearer " + SomeToken);
request.AddParameter("application/json", "{\"keys\" : \"name\" ,\"age\"}");

var response = client.Execute(request);

我不知道如何转换这一行:

--data-urlencode 'keys: name, age' \

编辑 1:

好的,正如@Evk 所说,我尝试了 curl commond :

curl -X POST \
--header "Authorization: Bearer SomeToken" \
 --header "X-Backtory-Object-Storage-Id: SomeId"  \
 --data-urlencode 'keys:Name' \
 --trace-ascii /dev/stdout 
 https://api.backtory.com/object-storage/classes/query/hotels

这是跟踪打印的内容:

 => Send header, 908 bytes (0x38c)
 0000: POST /object-storage/classes/query/hotels HTTP/1.1
 0034: Host: api.backtory.com
 004c: User-Agent: curl/7.52.1
 0065: Accept: */*
 0072: Authorization: Bearer SomeToken
 030d: X-Backtory-Object-Storage-Id: SomeId
 0345: Content-Length: 17
 0359: Content-Type: application/x-www-form-urlencoded
 038a:
 => Send data, 17 bytes (0x11)
 0000: %27keys%3AName%27

和错误:

 {
 "timestamp" : "2017-01-13T13:59:29.883UTC",
 "status" : 500,
 "error" : "Internal Server Error",
 "exception" : "com.google.gson.JsonSyntaxException",
 "message" : "org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 19 path $",
 "path" : "/classes/query/hotels"
 }

对于更多细节,我无法控制服务器端!

【问题讨论】:

  • keys: name, age 看起来像简单的文本,由 curl 进行 url 编码。因此,您必须对此文本进行编码并将其作为查询正文传递。并且,可能还要设置“Content-Type: application/x-www-form-urlencoded”标头。
  • @GeorgeSovetov 谢谢,但我不明白你的意思。 request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddParameter("application/json", "{\"keys\" : \"name\" , \"age\"}");
  • 这里是发布数据的方法:stackoverflow.com/a/21406569/1833960。但是您需要另一种内容类型。
  • 不确定但可以试试这个 request.addparameter("application/x-www-form-urlencoded", HttpUtility.HtmlEncode("key:name,age"), ParameterType.RequestBody) 而不是request.AddParameter("application/json","{\"keys\" : \"name\" ,\"age\"}");
  • @AllenKing 我试过 Html Encode ... 没用

标签: c# php rest curl restsharp


【解决方案1】:

你试过这种方式吗?指定请求接受 json 吗?

RestClient client = new RestClient("https://api.SomeDomain.com");
RestRequest request = new RestRequest("/object-storage/classes/query/hotels", Method.POST);
**request.AddHeader("Accept", "application/json");**

request.AddHeader("_Id", "SomeId");
request.AddHeader("Authorization", "Bearer " + SomeToken);
request.AddParameter("application/json", "{\"keys\" : \"name\" ,\"age\"}");

var response = client.Execute(request);

【讨论】:

    【解决方案2】:

    data-urlencode of curl 只会对您传递给它的内容进行 url 编码并将其写入正文。您可以通过以下方式进行检查:

    curl -X POST --data-urlencode 'keys:name, age' --trace-ascii /dev/stdout  https://api.SomeDomain.com/object-storage/classes/query/Player
    

    请求将是:

    0000: POST / HTTP/1.1
    0011: User-Agent: curl/7.29.0
    002a: Host: google.com
    003c: Accept: */*
    0049: Authorization: Bearer SomeToken
    006a: _Id: SomeId
    0049: Content-Length: 20
    005d: Content-Type: application/x-www-form-urlencoded
    0000: keys%3Aname%2C%20age < here is your body
    

    要对 RestSharp 做同样的事情,url 自己编码并作为 body 参数传递:

    RestClient client = new RestClient("http://api.SomeDomain.com");
    RestRequest request = new RestRequest("/object-storage/classes/query/hotels", Method.POST);
    request.AddHeader("_Id", "SomeId");
    request.AddHeader("Authorization", "Bearer " + "SomeToken");
    request.AddParameter("application/x-www-form-urlencoded", HttpUtility.UrlEncode("keys: name, age"), ParameterType.RequestBody);
    
    var response = client.Execute(request);
    

    请求将是:

    _Id: SomeId
    Authorization: Bearer SomeToken
    Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
    User-Agent: RestSharp/105.2.3.0
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 19
    Accept-Encoding: gzip, deflate
    Connection: Keep-Alive
    
    keys%3a+name%2c+age < your body. Spaces are encoded as "+" instead of "%20" but that should be ok
    

    如果这不起作用,请准确发布生成的错误消息(如果有)。

    【讨论】:

    • 谢谢。但是我收到了这个错误{“时间戳”:“2017-01-13T05:26:09.817UTC”,“状态”:500,“错误”:“内部服务器错误”,“异常”:“com.google.gson。 JsonSyntaxException", "message" : "org.springframework.web.util.NestedServletException: 请求处理失败;嵌套异常是 com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: 使用 JsonReader.setLenient(true)在第 1 行第 14 列接受格式错误的 JSON 路径 $", "path" : "/classes/query/hotels"
    • 但它适用于确切的 curl 命令?因为它似乎需要json,但是curl命令也没有传递json。
    • 是的,你是对的...... curl 命令也不起作用。我编辑了我的问题,检查一下。
    猜你喜欢
    • 1970-01-01
    • 2022-07-08
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多