web-dev-qa-db-ja.com

RestSharp POST JSONとしてのオブジェクト

これが私のクラスです:

public class PTList
{
    private String name;

    public PTList() { }
    public PTList(String name)
    {
        this.name = name;
    }


    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

}

そして私のRestSharp POSTリクエスト:

    protected static IRestResponse httpPost(String Uri, Object Data)
    {
        var client = new RestClient(baseURL);
        client.AddDefaultHeader("X-Authentication", AuthenticationManager.getAuthentication());
        client.AddDefaultHeader("Content-type", "application/json");
        var request = new RestRequest(Uri, Method.POST);

        request.RequestFormat = DataFormat.Json;

        request.AddJsonBody(Data);

        var response = client.Execute(request);
        return response;
    }

また、適切なURIとPTListオブジェクトを指定してhttpPostメソッドを使用すると、フロントAPIは「name」がnullであると応答します。私のPTListオブジェクトはAPIのリクエストで有効なJSONとしてシリアル化されていないと思いますが、何が問題になっているのか理解できません。

6
OhMyGuruFR

私が見ることができるいくつかの問題があります。

1つ目は、送信するオブジェクトにパブリックフィールドがないことです。また、定義を少し簡略化します。

public class PTList
{
    public PTList() { get; set; }
}

2番目の問題は、RestSharpがContent-Typeを設定することによって行うrequest.RequestFormat = DataFormat.Jsonヘッダーを設定していることです。

また、Objectではなくジェネリックを使用したいと思います。

HttpPostメソッドは次のようになります。

protected static IRestResponse httpPost<TBody>(String Uri, TBody Data)
    where TBody : class, new
{
    var client = new RestClient(baseURL);
    client.AddDefaultHeader("X-Authentication", AuthenticationManager.getAuthentication());
    var request = new RestRequest(Uri, Method.POST);
    request.RequestFormat = DataFormat.Json;
    request.AddJsonBody(Data);

    var response = client.Execute(request);
    return response;
}
2
phuzi

RestSharpがデフォルトで使用するJsonシリアライザーは、プライベートフィールドをシリアル化しません。したがって、次のようにクラスを変更できます。

public class PTList
{        
    public PTList() { }

    public PTList(String name) {
        this.name = name;
    }

    public string name { get; set; }
}

そしてそれはうまくいくでしょう。

デフォルトのシリアライザーの機能が十分でない場合(私が知る限り、プロパティの名前を変更することもできません。たとえば、Namenameとしてシリアル化することもできません)-より優れたシリアライザーを使用できます。 JSON.NETのように、説明されているように ここ たとえば。

1
Evk

AddJsonBodyの代わりにこれを試すことができます:

request.AddParameter( "application/json; charset = utf-8"、JsonConvert.SerializeObject(Data)、ParameterType.RequestBody);

これはここでの解決策の1つです: JSONをRestSharpに追加する方法POSTリクエスト

1
Palle Due