2015-09-17 11 views
8

Próbuję przekazać obiekt Dictionary<string,string> jako parametr do mojej metody interfejsu API, ale jeśli sprawdzam plik dziennika, zawsze przychodzi z liczbą 0:Przesyłanie parametru Dictionary <string, string> w api WWW

metoda Web API:

[HttpPost] 
[ActionName("SendPost")] 
public void SendPost([FromBody] Dictionary<string,string> values) 
{ 
    using (var sw = new StreamWriter("F:\\PostTest.txt", true)) 
    { 
     sw.WriteLine("Number of items in the dictionary - " + values.Count); 
    } 
} 

Logic, która wywołuje API internetowej:

public HttpResponseMessage Send(string uri, string value) 
{ 
    HttpResponseMessage responseMessage = null; 

    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(URI); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     var content = new FormUrlEncodedContent 
      (
       new Dictionary<string, string> { { "value", value } } 
      ); 

     responseMessage = client.PostAsync(uri, content).Result; 
    } 
    return responseMessage; 
} 

Odpowiedz

7

Problem polega na tym, że mówisz, że typem treści jest "application/json", ale przekazujesz go jako FormUrlEncodedContent. Trzeba użyć StringContent i szeregować zawartości do JSON się, czy można użyć metody EXTENTION HttpClientExtensions.PostAsJsonAsync który serializuje treści JSON dla Ciebie:

public async Task<HttpResponseMessage> SendAsync(string uri, string value) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(URI); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(
         new MediaTypeWithQualityHeaderValue("application/json")); 

     return await client.PostAsJsonAsync(uri, content); 
    } 
} 
+0

Zmieniłem sposób używać PostAsJsonAsync ale to jeszcze mówiąc liczba słów w pliku dziennika wynosi 0. Czy mogę również zmienić sposób, w jaki przechodzę przez treść w moim przykładzie? –

+0

@DenisWessels Czy użyłeś kodu, który napisałem? A może zmodyfikowałeś swoje? –

+0

Przepraszam, że jestem głupi, poprawnie przeczytałem twoje wyjaśnienia i zmieniłem logikę, aby używać PostAsJsonAsync i przechodzę przez słownik bezpośrednio, bez tworzenia FormUrlEncodedContent. Teraz działa! –