2012-06-28 15 views
19

Estoy trabajando con una API y tratando de hacer una solicitud JSON PUT dentro de C#. Este es el código que estoy usando:Pasar valores a una solicitud PUT JSON en 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; 
     } 
    } 

El problema es que no puedo entender cómo pasar los datos a la API. Así como en JavaScript que haría algo como esto para pasar los datos:

 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' 

¿Cómo voy a ir haciendo lo mismo en C#? ¡Gracias!

Respuesta

13
httpWebRequest.ContentType = "text/json"; 

duda, debe ser:

httpWebRequest.ContentType = "application/json"; 

Aparte de eso, no veo nada malo en su código actual.

En cuanto a la parte de generación de JSON se refiere usted podría utilizar un JSON serializer:

var serializer = new JavaScriptSerializer(); 

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

En este ejemplo he utilizado, obviamente, un objeto anónimo pero podría perfectamente bien definir un modelo cuyas propiedades igualar y luego pasar una instancia de este modelo para el método Serialize. También es posible que desee consultar la biblioteca Json.NET que es un serializador JSON de terceros que es más ligero y más rápido que el .NET incorporado.


Pero todo Dicho esto, también puede haber oído de la ASP.NET Web API, así como la próxima .NET 4.5. Si lo hizo, debe tener en cuenta que habrá un cliente web API HTTP (HttpClient) que está diseñado específicamente para esas necesidades. Usar un WebRequest para consumir una API habilitada para JSON se considerará como código obsoleto en un par de meses. Menciono esto porque podrías usar NuGet para usar este nuevo cliente ahora mismo y simplificar la vida del alma pobre (encargada de migrar tu código a .NET XX) que analizará tu código dentro de un par de años y probablemente ni siquiera sabría qué es WebRequest :-)

+0

¡Perfecto! ¡Hice justo lo que necesitaba! ¡Gracias! –

10

Si desea imitar el comportamiento de JavaScript de un cliente .NET C# también debe establecer algunas configuraciones adicionales en el objeto Request, además de ContentType, aquí hay una ejemplo de trabajo:

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; 

de esta manera el contenido completo será enviado junto con la solicitud, por lo tanto, las carpetas de datos del API web ASP.NET MVC puede trabajar su magia.

No hace falta decir que debe tener cuidado con el tamaño del contenido, ya que se enviará todo a la vez, no se transmitirá ni se procesará por secuencias.

Cuestiones relacionadas