RestSharp AddBody добавляет двойную кавычку в параметре JSON - PullRequest
0 голосов
/ 15 февраля 2019

Я звоню API с RESTSharp

  var client = new RestClient("http://demoservice.com");
  var request = new RestRequest("callapi", "put");          
  request.RequestFormat = DataFormat.Json;

string jsonaction = "{\"tokenid\":\"x123x45\",\"userid\":\"2456\",\"ip\":\"192.168.1.20\",\"transaction\":\"6\",\"actionCode\":\"78\",\"jtoken\":\"systemtoken\"}";
request.AddBody(new { action = "SAVE", data = "savedata", token = "systemtoken", jsonaction = jsonaction });

Я проверяю данные отладки, передаваемые в запросе.и мой ожидаемый результат выглядит следующим образом:

{"action":"SAVE","data":"savedata","token":"systemtoken","jsonaction":{"tokenid":"x123x45","userid":"2456","ip":"192.168.1.20","transaction":"6","actionCode":"78","jtoken":"systemtoken"}}

Но получается

{"action":"SAVE","data":"savedata","token":"systemtoken","jsonaction":"{"tokenid":"x123x45","userid":"2456","ip":"192.168.1.20","transaction":"6","actionCode":"78","jtoken":"systemtoken"}"}

Если кто-нибудь может подсказать, как публиковать сообщения для JSON, я пробовал с Addbody и AddJsonBody, но ничего не работает.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Вы можете сделать это, используя метод request.AddParameter():

request.Method = Method.POST;
request.AddHeader("Accept", "application/json");
request.Parameters.Clear();
request.AddParameter("application/json", data , ParameterType.RequestBody);

var response = client.Execute(request);
var content = response.Content; // raw content as string  

Где данные имеют формат:

data :

{
  "action":"dosomething" ,
  "data":"somedata" ,
  "token":"sometoken",
  "jsonAction": {
    "tokenId": "",
    ...
}

Надеюсь, это поможет!

0 голосов
/ 15 февраля 2019

Из двух гениальных людей я мог бы заполнить следующий код

jsonaction objjsonaction = new jsonaction();
            objjsonaction.tokenid = "x123x45";
            objjsonaction.userid = "2456";
            objjsonaction.ip = "192.168.1.20";
            objjsonaction.transaction = "6";
            objjsonaction.actionCode = "78";
            objjsonaction.jtoken = gentoken("key"); // gentoken() is external function for generating token from key

string sobjjsonaction = Newtonsoft.Json.JsonConvert.SerializeObject(objjsonaction);
            sobjjsonaction = sobjjsonaction.Replace("__", "-");

            JObject jObject = new JObject();
            jObject["action"] = "SAVE";
            jObject["data"] = getpostdata(); // a function to generate data from db
            jObject["token"] = gentoken("key"); // gentoken() is external function for generating token from key
            jObject["jsonaction"] = JObject.Parse(sobjjsonaction);

            string sObject = Regex.Replace(jObject.ToString(), @"\s+", "");

            //request.Method = Method.PUT;
            request.AddHeader("Accept", "application/json");
            request.Parameters.Clear();
            request.AddParameter("application/json", sObject, ParameterType.RequestBody);
0 голосов
/ 15 февраля 2019

Я бы предложил вам использовать JObject, чтобы создать ваше тело для запроса, например,

JObject jObject = new JObject();
jObject["action"] = "SAVE";
jObject["data"] = "savedata";
jObject["token"] = "systemtoken";
jObject["jsonaction"] = JObject.Parse("{\"tokenid\":\"x123x45\",\"userid\":\"2456\",\"ip\":\"192.168.1.20\",\"transaction\":\"6\",\"actionCode\":\"78\",\"jtoken\":\"systemtoken\"}");

, а затем передать jObject либо

request.AddBody(jObject.ToString());

ИЛИ

request.AddJsonBody(jObject.ToString());

А для JObject вам нужно импортировать using Newtonsoft.Json.Linq; пространство имен в вашу программу, и вы можете найти это пространство имен в пакете newtonsoft.json.

Вы даже можете использовать вот так

request.AddBody(new { action = "SAVE", data = "savedata", token = "systemtoken", jsonaction = JObject.Parse(jsonaction) });

Но лучше всего создать JObject для ваших полных данных json, который минимизирует ошибки и исключения при создании собственных данных json со строкой

Вывод:

enter image description here

...