web-dev-qa-db-ja.com

Restsharpを使用してオブジェクトをシリアル化し、リストをシリアル化しないWeb APIに渡す

次のようなビューモデルがあります。

public class StoreItemViewModel
{
    public Guid ItemId { get; set; }
    public List<Guid> StoreIds { get; set; }
    [Required]
    public string Description { get; set; }
    //[Required]
    //[DataMember(IsRequired = true)]
    public int ItemTypeId { get; set; }


}

RestSharpを使用している小さなヘルパーがあります。

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
    {
        var client = new RestClient(CreateBaseUrl(null))
        {
            Authenticator = new HttpBasicAuthenticator("user", "Password1")
        };

        var request = new RestRequest(apiEndPoint, Method.POST);
        //request.JsonSerializer = new JsonSerializer();
       // {RequestFormat = DataFormat.Json};
        request.AddObject(objectToUpdate);
       // clientJsonSerializer = new YourCustomSerializer();
        var response = client.Execute<T>(request);
        return response;
    }

私のAPI内でコントローラーをデバッグするとき

 [HttpPost]
    public HttpResponseMessage Create([FromBody]StoreItemViewModel myProduct)
    {
        //check fields are valid
     .........
     }

myProducts製品は、パブリックリストStoreIdsを除いてすべて入力され、常に空のGuidを持つ単一の報酬を返します。 2つ以上のStoreIdを追加した場合でも

これは、アプリケーション内のCreateヘルパーで何か問題があるためだと思います。

誰かがこれを手伝って、それが大きな頭痛の原因になることはありますか?.

Webapiに送信される生データは次のようになります

ItemId=f6dbd244-e840-47e1-9d09-53cc64cd87e6&ItemTypeId=6&Description=blabla&StoreIds=d0f36ef4-28be-4d16-a2e8-37030004174a&StoreIds=f6dbd244-e840-47e1-9d09-53cc64cd87e6&StoreId=d0f36ef4-28be-4d16-a2e8-37030004174a
12
Diver Dan

私はなんとかこれを機能させることができました。私はそれが正しい方法だとは思いませんが、うまくいきます。

 public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
    {
        var client = new RestClient(CreateBaseUrl(null))
        {
            Authenticator = new HttpBasicAuthenticator("user", "Password1")
        };
        var json = JsonConvert.SerializeObject(objectToUpdate);
        var request = new RestRequest(apiEndPoint, Method.POST);
        request.AddParameter("text/json", json, ParameterType.RequestBody);
        var response = client.Execute<T>(request);
        return response;
    }
19
Diver Dan

RestSharpには、Jsonシリアライゼーションを使用してRestRequestボディにオブジェクトを追加するためのより効率的な方法があります。

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
{
    var client = new RestClient(CreateBaseUrl(null))
    {
        Authenticator = new HttpBasicAuthenticator("user", "Password1")
    };
    var request = new RestRequest(apiEndPoint, Method.POST);
    request.AddJsonBody(objectToUpdate); // HERE
    var response = client.Execute<T>(request);
    return response;
}

これはRestSharp 105.0.1.0で見つかりました

23
Paddy

私は同じ問題で苦労し、実用的な解決策を思いつきました。

  1. 必ずリクエスト形式をJSONに設定してください:

    request.RequestFormat = DataFormat.Json;

  2. AddObjectではなくAddBodyを使用します。

    request.AddBody(zNewSessionUsage);

したがって、コードは次のようになります。

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
{
    var client = new RestClient(CreateBaseUrl(null))
    {
        Authenticator = new HttpBasicAuthenticator("user", "Password1")
    };

    var request = new RestRequest(apiEndPoint, Method.POST);
    request.RequestFormat = DataFormat.Json;
    request.AddBody(objectToUpdate);
    var response = client.Execute<T>(request);
    return response;
}
14
bigtech