2012-06-28 11 views
19

Pracuję z interfejsem API i próbuję wykonać żądanie JSON PUT w C#. To jest kod, którego używam:Przekazywanie wartości do żądania JSON PUT w C#

public static bool SendAnSMSMessage() 
    { 
     var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://apiURL"); 
     httpWebRequest.ContentType = "text/json"; 
     httpWebRequest.Method = "PUT"; 

     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      string json = **// Need to put data here to pass to the API.** 

      streamWriter.Write(json); 
     } 
     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      var responseText = streamReader.ReadToEnd(); 
      //Now you have your response. 
      //or false depending on information in the response 
      return true; 
     } 
    } 

Problem polega na tym, że nie mogę wymyślić, jak przekazać dane do interfejsu API. Tak jak w JavaScript chciałbym zrobić coś takiego, aby przekazać dane:

 type: 'PUT', 
     data: { 'reg_FirstName': 'Bob', 
       'reg_LastName': 'The Guy', 
       'reg_Phone': '123-342-1211', 
       'reg_Email': '[email protected]', 
       'reg_Company': 'None', 
       'reg_Address1': 'Some place Dr', 
       'reg_Address2': '', 
       'reg_City': 'Mars', 
       'reg_State': 'GA', 
       'reg_Zip': '12121', 
       'reg_Country': 'United States' 

Jak mam zrobić to samo w języku C#? Dzięki!

Odpowiedz

13
httpWebRequest.ContentType = "text/json"; 

zdecydowanie powinien być:

httpWebRequest.ContentType = "application/json"; 

Poza tym nie widzę nic złego z aktualnym kodem.

Jeśli chodzi o część generacja JSON jest zaniepokojony można użyć JSON serializer:

var serializer = new JavaScriptSerializer(); 

string json = serializer.Serialize(new 
{ 
    reg_FirstName = "Bob", 
    reg_LastName = "The Guy", 
    ... and so on of course 
}); 

W tym przykładzie mam oczywiście używane anonimowy obiekt ale można perfekcyjnie zdefiniować model, którego właściwości dopasować, a następnie przekazać wystąpienie tego modelu w metodzie Serialize. Możesz także chcieć wypróbować bibliotekę Json.NET, która jest serializatorem JSON innej firmy, który jest lżejszy i szybszy niż wbudowany .NET.


Ale wszystko zostało powiedziane, to polubisz też nie słyszał o ASP.NET Web API jak nadchodząca .NET 4.5. Jeśli tak, powinieneś wiedzieć, że będzie klient sieciowy API HTTP (HttpClient), który jest specjalnie dostosowany do tych potrzeb. Używanie interfejsu API z obsługą JSON będzie uważane za przestarzały kod w ciągu kilku miesięcy. Wspominam o tym, ponieważ możesz teraz użyć NuGet do korzystania z tego nowego klienta już teraz i uprościć życie biednej duszy (z zadaniem przeniesienia twojego kodu do .NET XX), który zajrzy twój kod za kilka lat i prawdopodobnie nie wiedziałby nawet, co to jest WebRequest :-)

+0

Idealnie! Właśnie tego potrzebowałem! Dzięki! –

10

Jeśli chcesz naśladować zachowanie JavaScript z klienta .NET C#, musisz ustawić kilka dodatkowych konfiguracji na obiekcie Request, oprócz ContentType, tutaj jest przykładem pracy:

string serializedObject = Newtonsoft.Json.JsonConvert.SerializeObject(entity); 
HttpWebRequest request = WebRequest.CreateHttp(storeUrl); 
request.Method = "PUT"; 
request.AllowWriteStreamBuffering = false; 
request.ContentType = "application/json"; 
request.Accept = "Accept=application/json"; 
request.SendChunked = false; 
request.ContentLength = serializedObject.Length; 
using (var writer = new StreamWriter(request.GetRequestStream())) 
{ 
    writer.Write(serializedObject); 
} 
var response = request.GetResponse() as HttpWebResponse; 

ten sposób pełna treść zostanie wysłana wraz z żądaniem, dlatego spoiwa danych ASP.NET MVC WebAPI może pracować ich magii.

Nie trzeba dodawać, że należy zachować ostrożność przy rozmiarze treści, ponieważ będzie on wysyłany naraz, a nie przesyłany strumieniowo/fragmentowany.

Powiązane problemy