2012-09-04 16 views
10

私は、そのようなビューモデルを持っています。restsharpでオブジェクトをシリアライズし、リストをシリアライズしないWebApiに渡します

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を使用している小さなヘルパーがあります。私のAPI内のコントローラをデバッグするとき

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

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

myProducts製品はすべて、それは常に空のGUIDを持つ単一報酬を返すパブリックリストStoreIdsから離れて読み込まれます。 2つ以上のStoreIdsを追加した場合でも、

私は自分のアプリケーション内で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 
+0

生のjsonリクエストの様子を共有することはできますか? –

+0

@KiranChalla申し訳ありませんが、どのようにrestsharpビットを使用して取得できますか? –

+0

要求/応答を取得するために、httpproxyであるFiddlerを使用することができます。 –

答えて

18

のように探しています。私はそれが正しい方法だとは思わないが、それは機能する。

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

このソリューションは私のために働いていました。しかし、私は "text/json"ではなく "application/json"を使用しなければなりませんでした。ありがとう! – carmbrester

+0

ちょっとこれを行う公式な方法を見つけましたか? – chobo2

13

私は同じ問題を抱えて苦労し、解決策を思いつきました。

  1. JSONへの要求フォーマット設定してください:

    request.RequestFormat = DataFormat.Jsonを。むしろAddObjectメソッドより

  2. 使用は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; 
} 
+1

そして、.RequestFormatが前にリストされている必要があります。上記の例のようにAddBodyを指定すると、デフォルトでXML Serializationがデフォルトになります。 – Jafin

19

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

関連する問題