2011-02-13 12 views
30

Próbuję dokonać a json call przy użyciu C#. Zrobiłem ukłucie przy tworzeniu połączenia, ale to nie działa:json wywołanie z 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; 
} 

Wszelkie porady, w jaki sposób dokonać tej pracy będą mile widziane.

+1

Czy otrzymujesz żadnych błędów ? Jak wygląda twoja "wiadomość"? Czy używasz właściwego klucza API? –

+0

@Drackir - Używam poprawnego klucza API (testowałem go za pomocą wersji e-mail api i zadziałało). Nie dostaję żadnych błędów. Po prostu nie dostaję wiadomości tekstowej. Wiadomość to tylko kilka prostych tekstów testowych ("test sms" (ale bez cytatów)). – Vaccano

+1

gdzie jest twoja odpowiedź? Złożyłeś wniosek, ale nie używasz GetResponseStream? –

Odpowiedz

38

W twoim kodzie nie dostajesz HttpResponse, więc nie zobaczysz, co odsyła cię serwer.

Musisz uzyskać odpowiedź podobną do sposobu, w jaki otrzymujesz (wykonujesz) Żądanie. Więc

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

ja również zauważyć w dokumentacji pennysms że oczekują typu zawartości "text/json" a nie "application/json". To może nie mieć znaczenia, ale warto spróbować, jeśli to nie zadziała.

+0

tekst/json czego szukam. Mam usługę odpoczynku i zawsze zwracano xml z powodu aplikacji/json. ??? –

4

Jeśli funkcja rezyduje w mvc kontroler u można użyć poniższy kod ze słownika przedmiotu co chcesz przekonwertować do formatu JSON

Json(someDictionaryObj, JsonRequestBehavior.AllowGet); 

także spróbować spojrzeć na system.web.script.serialization.javascriptserializer jeśli używasz .NET 3.5

jak żądanie sieciowe ... wydaje się ok na pierwszy rzut oka ..

chciałbym użyć czegoś takiego ..

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

Możliwe, że możesz ustawić parametr post i json jako parametr i użyć go jako ogólnej metody webrequest dla wszystkich połączeń.

+0

Jaki jest sens: 'var webRequest = System.Net.WebRequest.Create (url) jako HttpWebRequest;' dlaczego nie tylko: 'HttpWebRequest webRequest = System.Net.WebRequest.Create (url);'? –

+4

@Drackir, WebRequest to klasa abstrakcyjna. Jest to (statyczna) Metoda Create (która jest zasadniczo metodą Factory) tworzy instancję odpowiedniej klasy w zależności od schematu Uri. Oznacza to, że jeśli schemat Uri zostanie określony jako "http", wówczas tworzy on instancję HttpWebRequest. Jeśli jest to "ftp", stworzy instancję FtpWebRequest. Robiąc "as", zmienna webRequest jest wpisywana jako instancja HttpWebRequest, a więc właściwości i metody specyficzne dla tej klasy będą dostępne. Czy to ma sens? Nazwałbym zmienną httpWebRequest (po to, aby być bardziej przejrzystym). –

+0

To jest dokumentacja MSDN dla tego, na wszelki wypadek. http://msdn.microsoft.com/en-us/library/bw00b1dc.aspx –

7

tylko kontynuuje co @Mulki wykonana ze swoim kodem

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

Oto wariacja odpowiedzi Shiv Kumar, wykorzystując Newtonsoft.Json (aka 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;   
    } 
}