web-dev-qa-db-ja.com

RestSharpがJSONオブジェクトを投稿する

RestSharpで次のJSONを投稿しようとしています。

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

私は近いと思いますが、SecurityQuestionに苦労しているようです(APIはパラメータが欠落しているというエラーを投げていますが、どちらが言っているのかはわかりません)

これは私がこれまでに持っているコードです:

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

そして、私のセキュリティ質問クラスは次のようになります。

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";
    }
}

誰かが私が間違っていることを教えてもらえますか?セキュリティ質問オブジェクトを投稿する他の方法はありますか?

どうもありがとう。

19
JamesWillett

ヘッダーでcontent-typeを指定する必要があります。

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

また、AddParameterは、POSTまたはMethodに基づくURLクエリ文字列に追加します

私はあなたがこのように体にそれを追加する必要があると思う:

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

ご協力ありがとうございます。これを機能させるには、すべてを単一のパラメーターとして送信する必要がありました。これは最後に使用したコードです。

最初に、Request ObjectおよびSecurity Questionと呼ばれるクラスをいくつか作成しました。

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; }
}

次に、次のように、単一のパラメーターとして追加し、投稿する前にJSONにシリアル化しました。

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

そしてそれは働いた!

21
JamesWillett

生のJSONボディ文字列を投稿するには、AddBody()またはAddJsonBody()メソッドは機能しません。代わりに次を使用してください

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

RestSharpメソッドによるオブジェクトからのAddObjectサポート

request.AddObject(securityQuestion);

これを行う最も簡単な方法は、RestSharpにすべてのシリアル化を処理させることです。そのようにRequestFormatを指定するだけです。ここに私が取り組んでいるもののために思いついたものがあります。 。

    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;
    }
1
FunkySax