0

ListをWeb APIに渡そうとしていますが、null値を取得し続けます。私はリストをAPIに渡す前に文字列に変換しています。どのように私はそれを正しくバインドできますか?ListオブジェクトをC#Web APIに渡します。POST

public async Task<ReturnViewModel> ModContactsAsync(List<ContactsDTO> Contacts) 
{ 
    ReturnViewModel vm = new ReturnViewModel(); 

    var postContactsUri = new UriBuilder(AppConfig.ServiceUrlBase); 

    //Converts object into a string 
    var jsonObject = new JavaScriptSerializer().Serialize(Contacts); 


    postContactsUri.Path = string.Format(POST_CONTACTS_API_PATH, jsonObject); 
    //Calls API 
    var response = await _httpClient.PostAsync(postContactsUri.ToString()); 

    return vm; 
} 

POST - APIコールリストPRODはnullです

[HttpPost] 
[Route("contacts/Save")] 
[ResponseType(typeof(ReturnMessage))] 
public async Task<IHttpActionResult> ModContacts([FromBody] List<ContactsDTO> prods) 
{ 
    try 
    { 
     await Task.Delay(10); 

     return Ok(); 
    } 
    catch (Exception ex) 
    { 
     throw new PropertyPortalWebApiException(HttpStatusCode.InternalServerError, "Contact information does not exist.", ex); 
    } 
    } 
+1

あなたはURLに連絡先を入れようとしていますが、リクエストの本文から連絡先を読み取っていますか? – Rhumborl

+0

'PostAsync'を次のように調整してください。' var response = await _httpClient.PostAsync(POST_CONTACTS_API_PATH、new System.Net.Http.StringContent(jsonObject、Encoding.UTF8、 "application/json")); ' – mike123

+0

@ mike123私はまだnullを取得します。 – Apollo

答えて

0

私は問題を把握しました。 PostAsyncに連絡先オブジェクトを追加して、2番目のパラメータに追加してください。オブジェクトをJSONに変換する必要はありません。

public async Task<ReturnViewModel> ModContactsAsync(List<ContactsDTO> Contacts) 
{ 
    ReturnViewModel vm = new ReturnViewModel(); 

    var postContactsUri = new UriBuilder(AppConfig.ServiceUrlBase); 

    postContactsUri.Path = string.Format(POST_CONTACTS_API_PATH, jsonObject); 
    //Add Contacts to second parameter 
    var response = await _httpClient.PostAsync(postContactsUri.ToString(), Contacts); 

return vm; 

}

-1

はい、それはあなたがモデルを送信しようとするためであるが、別の方法では、あなたがオブジェクトの一覧を取得しようとすることはnullです。 要求の読み取り後にオブジェクトのリストを含むオブジェクトを取得する必要があります。

ModContacts([FromBody] ContactDTOのPROD)ContactDTOで

あなたは

+0

私はモデルを送信していません。私はリストを送っています。 – Apollo

0
public IActionResult GetAllContacts() 
{ 
    List<Contacts> contacts = contactService.RetrieveAllContacts(); 
    return Json(contacts); 
} 

だから理論的には上記のあなたのAPIになり、シリアライズ可能になるオブジェクトのリストを持っている必要があります。ユーザーはGetAllContactsを要求し、データベースから連絡先を取得し、Json経由で返信します。

次に、消費者は消費するようにコードを記述します。上記のような

var request = CreateWebRequest(url) as HttpWebRequest; 
if(request != null) 
    using(var response = request.GetResponse.GetResponseStream()) 
      var content = Json.DeserializeObject(request.ReadToEnd()); 

何かが、あなたのためList<Contacts>を返す必要があります。

私はあなたがしようとしていると信じています。


更新:

私はあなたは、消費者がデータを保存することに気づきました。あなたはこれらの線に沿って何かをするでしょう:

public IActionResult SaveContact([FromBody] List<Contacts>) 
{ 
    // Validate and Save 
} 

消費者は、Ajaxや何かの長いこれらの行のいずれかだろう。

List<Contact> contacts = contactService.GetAllContacts(); // User would have a collection for you. 
var post = Json.SerializeObject(contacts); 

var request = WebRequest.Create(url) as HttpWebRequest; 
request.Method = "POST"; 
request.ContentType = ... 
request.ContentLength = post.Length; 
request.UserAgent = ... 
request.Accept = ... 
request.Referer = ... 

using(var writer = new StreamWriter(request.GetRequestStream()) 
{ 
    writer.Write(post); 
    request.GetResponse(); 
    request.Close(); 
} 

あなたは、私が示される要求のすべてのパラメータを必要としませんが、それらを存在する。うまくいけば、これは役に立ちます。

+0

Greg、APIにListを渡そうとしています。上記をAPI呼び出しにどのように渡すことができますか? – Apollo

+0

https://stackoverflow.com/questions/28106872/how-to-post-json-object-array-to-a-web-api – Apollo

+0

@Apollo Through AjaxまたはC#?コードを 'var'よりも明示的にしました。 – Greg

0

あなたが簡単に検索し、理解GET/POSTの違いを、どのようにHttpClientを投稿する必要があります。

まず、あなたのコンテンツをURLに追加し、HttpClientで投稿しようとしています。

var response = await _httpClient.PostAsync(postContactsUri.ToString()); 

あなたのAPIでは、URLで渡されたFromBodyオブジェクトを読み込んでいます。

public async Task<IHttpActionResult> ModContacts([FromBody] List<ContactsDTO> prods) 

PostAsyncメソッドのシグネチャは

public Task PostAsync(Uri uri, HttpContent content) 

ですから、2番目のパラメータとしてHttpContentの形態の第1パラメータと、あなたのリストオブジェクトにURLを渡す必要があります。

また、PostAsJsonAsync拡張メソッドを使用することもできます。

+0

ありがとうございます。 – Apollo

関連する問題