web-dev-qa-db-fra.com

RestSharp Publier un objet JSON

J'essaie de publier le JSON suivant avec RestSharp:

{"UserName":"UAT1206252627",
"SecurityQuestion":{
    "Id":"Q03",
    "Answer":"Business",
    "Hint":"The answer is Business"
},
}

Je pense que je suis proche, mais il me semble que j’ai des difficultés avec SecurityQuestion (l’API génère une erreur indiquant qu’un paramètre est manquant, mais il ne dit pas lequel).

C'est le code que j'ai jusqu'à présent:

var request = new RestRequest("api/register", Method.POST);
request.RequestFormat = DataFormat.Json;

request.AddParameter("UserName", "UAT1206252627");

SecurityQuestion securityQuestion = new SecurityQuestion("Q03");
request.AddParameter("SecurityQuestion", request.JsonSerializer.Serialize(securityQuestion));

IRestResponse response = client.Execute(request);

Et ma classe de question de sécurité ressemble à ceci:

public class SecurityQuestion
{
    public string id {get; set;}
    public string answer {get; set;}
    public string hint {get; set;}

    public SecurityQuestion(string id)
    {
         this.id = id;
         answer = "Business";
         hint = "The answer is Business";
    }
}

Quelqu'un peut-il me dire ce que je fais mal? Existe-t-il un autre moyen de publier l'objet Question de sécurité?

Merci beaucoup.

16
JamesWillett

Vous devez spécifier le type de contenu dans l'en-tête:

request.AddHeader("Content-type", "application/json");

AddParameter ajoute également à POST ou à une chaîne de requête URL en fonction de

Je pense que vous devez l'ajouter au corps comme ceci:

request.AddJsonBody(
    new 
    {
      UserName = "UAT1206252627", 
      SecurityQuestion = securityQuestion
    }); // AddJsonBody serializes the object automatically
37
Oluwafemi

Merci encore pour votre aide. Pour que cela fonctionne, je devais tout soumettre comme un paramètre unique. C'est le code que j'ai utilisé à la fin.

J'ai d'abord créé deux classes appelées demande d'objet et question de sécurité:

public class SecurityQuestion
{
    public string Id { get; set; }
    public string Answer { get; set; }
    public string Hint { get; set; }
}

public class RequestObject
{
    public string UserName { get; set; }
    public SecurityQuestion SecurityQuestion { get; set; }
}

Ensuite, je l'ai simplement ajouté en tant que paramètre unique et l'ai sérialisé en JSON avant de le publier, comme suit:

var yourobject = new RequestObject
            {
                UserName = "UAT1206252627",
                SecurityQuestion = new SecurityQuestion
                {
                    Id = "Q03",
                    Answer = "Business",
                    Hint = "The answer is Business"
                },
            };
var json = request.JsonSerializer.Serialize(yourobject);

request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);

IRestResponse response = client.Execute(request);

et ça a fonctionné!

18
JamesWillett

Pour poster une chaîne de corps json brute, les méthodes AddBody () ou AddJsonBody () ne fonctionneront pas. Utilisez ce qui suit à la place

request.AddParameter(
   "application/json",
   "{ \"username\": \"johndoe\", \"password\": \"secretpassword\" }", // <- your JSON string
   ParameterType.RequestBody);
2
Eternal21

RestSharp pris en charge à partir d'objet par la méthode AddObject

request.AddObject(securityQuestion);

Pour ce faire, le moyen le plus simple consiste à laisser RestSharp gérer l’ensemble de la sérialisation. Il vous suffit de spécifier le RequestFormat comme suit. Voici ce que j'ai proposé pour ce sur quoi je travaille. .

    public List<YourReturnType> Get(RestRequest request)
    {
        var request = new RestRequest
        {
            Resource = "YourResource",
            RequestFormat = DataFormat.Json,
            Method = Method.POST
        };
        request.AddBody(new YourRequestType());

        var response = Execute<List<YourReturnType>>(request);
        return response.Data;
    }

    public T Execute<T>(RestRequest request) where T : new()
    {
        var client = new RestClient(_baseUrl);

        var response = client.Execute<T>(request);
        return response.Data;
    }
0
FunkySax