конвертировать команду curl в restsharp

Как преобразовать эту команду 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 -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"}

и для более подробной информации у меня нет контроля на стороне сервера!

2

Решение

data-urlencode из 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

Если это не сработает, напишите точно, какое сообщение об ошибке выдается (если есть).

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);
1

По вопросам рекламы [email protected]