2011-02-13 11 views
30

Estoy tratando de hacer a json call usando C#. Hice una puñalada en la creación de una llamada, pero no funcionó:json llamada con C#

public bool SendAnSMSMessage(string message) 
{ 
    HttpWebRequest request = (HttpWebRequest) 
          WebRequest.Create("http://api.pennysms.com/jsonrpc"); 
    request.Method = "POST"; 
    request.ContentType = "application/json"; 

    string json = "{ \"method\": \"send\", "+ 
        " \"params\": [ "+ 
        "    \"IPutAGuidHere\", "+ 
        "    \"[email protected]\", "+ 
        "    \"MyTenDigitNumberWasHere\", "+ 
        "    \""+message+"\" " + 
        "    ] "+ 
        "}"; 

    StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
    writer.Write(json); 
    writer.Close(); 

    return true; 
} 

Algún consejo sobre cómo hacer este trabajo sería apreciada.

+1

¿Usted está consiguiendo los errores ? ¿Cómo se ve tu 'mensaje'? ¿Estás usando una clave API adecuada? –

+0

@Drackir - Estoy usando la Clave API correcta (la probé con una versión de correo electrónico de la API y funcionó). No obtengo ningún error Simplemente no recibo un mensaje de texto. El mensaje es solo un texto de mensaje de prueba simple ("prueba de sms" (pero sin comillas)). – Vaccano

+1

¿dónde está su respuesta? ¿Hace una solicitud pero no usa GetResponseStream? –

Respuesta

38

En su código no obtiene la respuesta HttpResponse, por lo que no verá lo que le envía el servidor.

necesita obtener la respuesta similar a la forma en que obtiene (hace) la solicitud. Así

public static bool SendAnSMSMessage(string message) 
{ 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://api.pennysms.com/jsonrpc"); 
    httpWebRequest.ContentType = "text/json"; 
    httpWebRequest.Method = "POST"; 

    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
    { 
    string json = "{ \"method\": \"send\", " + 
         " \"params\": [ " + 
         "    \"IPutAGuidHere\", " + 
         "    \"[email protected]\", " + 
         "    \"MyTenDigitNumberWasHere\", " + 
         "    \"" + message + "\" " + 
         "    ] " + 
         "}"; 

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

También noto en la documentación pennysms que esperan un tipo de contenido "text/json" y no "application/json". Puede que eso no haga la diferencia, pero vale la pena intentarlo en caso de que no funcione.

+0

text/json lo que estoy buscando. Tengo un servicio de descanso y siempre devolvió xml debido a la aplicación/json. ??? –

4

Si su función reside en un controlador MVC u puede utilizar el código de abajo con un objeto de diccionario de lo que quiere para convertir a JSON

Json(someDictionaryObj, JsonRequestBehavior.AllowGet); 

también tratar de mirar a system.web.script.serialization.javascriptserializer si está utilizando .NET 3.5

como para su petición de web ... parece bien a primera vista ..

me gustaría utilizar algo como esto ..

public void WebRequestinJson(string url, string postData) 
    { 
    StreamWriter requestWriter; 

    var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; 
    if (webRequest != null) 
    { 
     webRequest.Method = "POST"; 
     webRequest.ServicePoint.Expect100Continue = false; 
     webRequest.Timeout = 20000; 

     webRequest.ContentType = "application/json"; 
     //POST the data. 
     using (requestWriter = new StreamWriter(webRequest.GetRequestStream())) 
     { 
      requestWriter.Write(postData); 
     } 
    } 
} 

Puede ser que usted pueda hacer que la cadena de correos y json sea un parámetro y usar esto como un método de búsqueda webrequest genérico para todas las llamadas.

+0

¿Cuál es el objetivo de esto: 'var webRequest = System.Net.WebRequest.Create (url) como HttpWebRequest;' ¿por qué no simplemente: 'HttpWebRequest webRequest = System.Net.WebRequest.Create (url);'? –

+4

@Drackir, WebRequest es una clase abstracta. Es (estático) el método Crear (que es esencialmente un método de Fábrica) crea una instancia de la clase apropiada dependiendo del esquema de Uri. Lo que significa que si se determina que el esquema de Uri es "http", entonces crea como instancia de HttpWebRequest. Si es "ftp" creará una instancia de FtpWebRequest. Al hacer el "como", la variable webRequest se escribe como una instancia de HttpWebRequest y, por lo tanto, las propiedades y los métodos específicos de esa clase estarán disponibles. ¿Tiene sentido? Llamaría a la variable httpWebRequest (para ser más claro). –

+0

Esta es la documentación de MSDN para esto, por las dudas. http://msdn.microsoft.com/en-us/library/bw00b1dc.aspx –

7

simplemente continuar lo @Mulki hizo con su código

public string WebRequestinJson(string url, string postData) 
{ 
    string ret = string.Empty; 

    StreamWriter requestWriter; 

    var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; 
    if (webRequest != null) 
    { 
     webRequest.Method = "POST"; 
     webRequest.ServicePoint.Expect100Continue = false; 
     webRequest.Timeout = 20000; 

     webRequest.ContentType = "application/json"; 
     //POST the data. 
     using (requestWriter = new StreamWriter(webRequest.GetRequestStream())) 
     { 
      requestWriter.Write(postData); 
     } 
    } 

    HttpWebResponse resp = (HttpWebResponse)webRequest.GetResponse(); 
    Stream resStream = resp.GetResponseStream(); 
    StreamReader reader = new StreamReader(resStream); 
    ret = reader.ReadToEnd(); 

    return ret; 
} 
6

Esto es una variación de la respuesta de Shiv Kumar, utilizando Newtonsoft.Json (también conocido como Json.NET):

public static bool SendAnSMSMessage(string message) 
{ 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://api.pennysms.com/jsonrpc"); 
    httpWebRequest.ContentType = "text/json"; 
    httpWebRequest.Method = "POST"; 

    var serializer = new Newtonsoft.Json.JsonSerializer(); 
    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
    { 
     using (var tw = new Newtonsoft.Json.JsonTextWriter(streamWriter)) 
     { 
      serializer.Serialize(tw, 
       new {method= "send", 
         @params = new string[]{ 
          "IPutAGuidHere", 
          "[email protected]", 
          "MyTenDigitNumberWasHere", 
          message 
         }}); 
     } 
    } 
    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;   
    } 
}