Soru C # ile json çağrısı


Yapmaya çalışıyorum bir json çağrısı C # kullanarak. Bir arama yaparken bir bıçak yaptım, ama işe yaramadı:

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\", "+
                  "             \"msg@MyCompany.com\", "+
                  "             \"MyTenDigitNumberWasHere\", "+
                  "             \""+message+"\" " +
                  "             ] "+
                  "}";

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

    return true;
}

Bu çalışmayı nasıl yapacağınıza dair herhangi bir tavsiye memnuniyetle karşılanacaktır.


32
2018-02-13 06:16


Menşei


Herhangi bir hatayla karşılaşıyor musunuz? Ne yapıyorsun message gibi görünmek? Uygun bir API anahtarı kullanıyor musunuz? - Richard Marskell - Drackir
@Drackir - Doğru API Anahtarını kullanıyorum (bunu, api'nin bir e-posta sürümü ile test ettim ve çalıştı). Ben hiç hata alamıyorum. Sadece kısa mesaj alamıyorum. Mesaj sadece bazı basit test mesajı metnidir ("sms testi" (ama tırnak işareti yoktur)). - Vaccano
cevabın nerede Bir istekte bulunursunuz, ancak GetResponseStream'i kullanmıyorsunuz? - Shiv Kumar
@Vaccano, C # hangi sürümünü kullanıyorsunuz? 3.5 / 4.0 kullanıyorsanız, WCF REST Starter kitine bir göz attınız mı? JSON (ve diğer) hizmetleri çağırmak için bir esinti yapan HttpClient sınıf var. Ham HttpWebRequest vs. ile uğraşmak zorunda değilsiniz. Bu belgeye göz atın msdn.microsoft.com/en-us/library/ee391967.aspx HttpClient bölümündeki Tüketici RESTful Hizmetlerine kaydırın (aşağıya doğru). - Shiv Kumar
@Vaccano, içerik türünü metin / json olacak şekilde kurnaz SMS belgelerine bakarak. Bunun bir fark yaratacağından emin değilsiniz, ancak kodunuzda değiştirmelisiniz. - Shiv Kumar


Cevaplar:


Kodunuzda HttpResponse'yi alamazsınız, bu yüzden sunucu tarafının size geri gönderdiği şeyi görmezsiniz.

Yanıtı, Talebi aldığınız şekle benzer şekilde almanız gerekir. Yani

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\", " +
                      "             \"msg@MyCompany.com\", " +
                      "             \"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;        
  }
}

Ayrıca, pennysms belgelerinde, "application / json" değil, "text / json" gibi bir içerik türü beklediklerini fark ettim. Bu bir fark yaratamaz, ama işe yaramazsa denemeye değer.


39
2018-02-14 04:23



metin / json ne aradığımı. Bir dinlenme servisi var ve her zaman uygulama / json nedeniyle xml döndü. ??? - Davut Gürbüz


sadece @Mulki'nin koduyla ne yaptığını sürdürmek

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

7
2018-06-16 04:01





İşte, Newtonsoft.Json (aka Json.NET) kullanarak, Shiv Kumar'ın cevabının bir varyasyonu:

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", 
                          "msg@MyCompany.com",
                          "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;        
    }
}

6
2018-05-28 23:38





Eğer fonksiyonunuz bir mvc kontrolöründe bulunuyorsa, aşağıdaki kodu json'a dönüştürmek istediğiniz şeyin bir sözlük nesnesi ile kullanabilirsiniz.

Json(someDictionaryObj, JsonRequestBehavior.AllowGet);

Ayrıca dene ve bak system.web.script.serialization.javascriptserializer .net 3.5 kullanıyorsanız

web isteğiniz için ... ilk bakışta iyi görünüyor ..

Böyle bir şey kullanırdım ..

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

Gönderiyi ve json dizesini bir parametre haline getirebilir ve bunu tüm çağrılar için genel bir web adresi olarak kullanabilirsiniz.


4
2018-02-13 07:06



Bunun amacı nedir: var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; neden sadece: HttpWebRequest webRequest = System.Net.WebRequest.Create(url);? - Richard Marskell - Drackir
@Drackir, WebRequest soyut bir sınıftır. Bu (statik) Oluşturma yöntemi (temel olarak bir Fabrika yöntemi) Uri şemasına bağlı olarak uygun sınıfın bir örneğini oluşturur. Uri şemasının "http" olduğu belirlenirse, o zaman HttpWebRequest örneğini oluşturur. Eğer "ftp" ise, FtpWebRequest'in bir örneğini oluşturacaktır. "As" ifadesini kullanarak, webRequest değişkeninin bir HttpWebRequest örneği olarak yazılması ve böylece bu sınıfla ilgili özellik ve yöntemlerin kullanılabilir olması sağlanmıştır. bu mantıklı mı? HttpWebRequest değişkenini (sadece daha açık olmak gerekirse) çağırırdım. - Shiv Kumar
Bu durumda, bunun için MSDN belgelendirmesi. msdn.microsoft.com/en-us/library/bw00b1dc.aspx - Shiv Kumar
Ne yazık ki MVC kullanmıyorum. Değişikliklerimi web isteğimde denerim. - Vaccano


Sadece Json verilerini nasıl yayınlayacağına dair bir örnek ve System.Net.WebRequest kullanarak BIDS 2008'deki Json verilerini bir Rest API'sine / sitesinden nasıl alabilirim? newtonsoft kullanmadan. Bu sadece örnek bir koddur ve kesinlikle iyi ayarlanabilmektedir (iyi test edilmiştir ve test amacım bir çekicilik gibi çalışmaktadır). Sadece size bir Fikir. Bu iş parçacığı istedim ama bu yüzden bunu yayınlamak bulamadım. Bağlantı 1 ve Bağlantı 2

Çalışan kod (test edilen birim)

           //Get Example
            var httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://abc.def.org/testAPI/api/TestFile");
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "GET";

            var username = "usernameForYourApi";
            var password = "passwordForYourApi";

            var bytes = Encoding.UTF8.GetBytes(username + ":" + password);
            httpWebRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(bytes));
            var httpResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse();
            using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                string result = streamReader.ReadToEnd();
                Dts.Events.FireInformation(3, "result from readng stream", result, "", 0, ref fireagain);
            }


            //Post Example
            var httpWebRequestPost = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://abc.def.org/testAPI/api/TestFile");
            httpWebRequestPost.ContentType = "application/json";
            httpWebRequestPost.Method = "POST";
            bytes = Encoding.UTF8.GetBytes(username + ":" + password);
            httpWebRequestPost.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(bytes));

            //POST DATA newtonsoft didnt worked with BIDS 2008 in this test package
            //json https://stackoverflow.com/questions/6201529/how-do-i-turn-a-c-sharp-object-into-a-json-string-in-net
            // fill File model with some test data
            CSharpComplexClass fileModel = new CSharpComplexClass();
            fileModel.CarrierID = 2;
            fileModel.InvoiceFileDate = DateTime.Now;
            fileModel.EntryMethodID = EntryMethod.Manual;
            fileModel.InvoiceFileStatusID = FileStatus.NeedsReview;
            fileModel.CreateUserID = "37f18f01-da45-4d7c-a586-97a0277440ef";
            string json = new JavaScriptSerializer().Serialize(fileModel);
            Dts.Events.FireInformation(3, "reached json", json, "", 0, ref fireagain);
            byte[] byteArray = Encoding.UTF8.GetBytes(json);
            httpWebRequestPost.ContentLength = byteArray.Length;
            // Get the request stream.  
            Stream dataStream = httpWebRequestPost.GetRequestStream();
            // Write the data to the request stream.  
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.  
            dataStream.Close();
            // Get the response.  
            WebResponse response = httpWebRequestPost.GetResponse();
            // Display the status.  
            //Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            Dts.Events.FireInformation(3, "Display the status", ((HttpWebResponse)response).StatusDescription, "", 0, ref fireagain);
            // Get the stream containing content returned by the server.  
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.  
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.  
            string responseFromServer = reader.ReadToEnd();
            Dts.Events.FireInformation(3, "responseFromServer ", responseFromServer, "", 0, ref fireagain);

BIDS 2008'deki test komut dosyasındaki referanslar (SP1 ve 3.5 çerçevesine sahip) enter image description here


0
2018-03-29 18:53