36 votes

Appel json avec C#

Je tente de faire un appel json en utilisant C#. J'ai essayé de créer un appel, mais cela n'a pas fonctionné :

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

    string json = "{ \"method\": \"send\", "+
                  "  \"params\": [ "+
                  "             \"JeMetsUnGuidIci\", "+
                  "             \"msg@MaSociete.com\", "+
                  "             \"MonNumeroADixChiffresIci\", "+
                  "             \""+message+"\" " +
                  "             ] "+
                  "}";

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

    return true;
}

Tout conseil sur la manière de faire fonctionner cela serait apprécié.

1 votes

Rencontrez-vous des erreurs? À quoi ressemble votre message? Utilisez-vous une clé d'API appropriée?

0 votes

@Drackir - J'utilise la bonne clé API (je l'ai testée avec une version e-mail de l'API et ça a fonctionné). Je ne reçois pas d'erreurs. Je ne reçois tout simplement pas de message texte. Le message est juste un texte de test simple ("test sms" (mais sans guillemets)).

1 votes

Où est votre réponse? Vous faites une demande mais vous n'utilisez pas GetResponseStream?

42voto

Shiv Kumar Points 5939

Dans votre code, vous n'obtenez pas la HttpResponse, donc vous ne verrez pas ce que le serveur envoie en retour.

vous devez obtenir la réponse de manière similaire à la façon dont vous faites la requête. Donc

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();
    //Maintenant vous avez votre réponse.
    //ou false en fonction des informations dans la réponse
    return true;        
  }
}

Je remarque également dans la documentation de pennysms qu'ils attendent un type de contenu "text/json" et non "application/json". Cela peut ne pas faire de différence, mais cela vaut la peine d'essayer au cas où cela ne fonctionnerait pas.

0 votes

Text/json ce que je recherche. J'ai un service REST et il renvoyait toujours du XML à cause de l'application/json. ???

8voto

jaysonragasa Points 444

Juste en continuant ce que @Mulki a fait avec son code

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

7voto

Diego Points 7661

Voici une variation de la réponse de Shiv Kumar, en utilisant Newtonsoft.Json (également appelé 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", 
                          "msg@MyCompany.com",
                          "MyTenDigitNumberWasHere",
                          message
                      }});
        }
    }
    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var responseText = streamReader.ReadToEnd();
        //Maintenant vous avez votre réponse.
        //ou faux en fonction des informations dans la réponse
        return true;        
    }
}

4voto

Mulki Points 1964

Si votre fonction réside dans un contrôleur mvc, vous pouvez utiliser le code ci-dessous avec un objet dictionnaire de ce que vous voulez convertir en json

Json(someDictionaryObj, JsonRequestBehavior.AllowGet);

Essayez également de consulter system.web.script.serialization.javascriptserializer si vous utilisez .net 3.5

quant à votre demande web ... cela semble correct à première vue..

Je utiliserais quelque chose comme ceci..

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

Peut-être que vous pouvez rendre la publication et la chaîne de json des paramètres et utiliser ceci comme une méthode webrequest générique pour tous les appels.

0 votes

Quel est l'intérêt de ceci : var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; pourquoi ne pas simplement : HttpWebRequest webRequest = System.Net.WebRequest.Create(url); ?

4 votes

@Drackir, WebRequest est une classe abstraite. Sa méthode Create (statique) (qui est essentiellement une méthode Factory) crée une instance de la classe appropriée en fonction du schéma de l'URI. Cela signifie que si le schéma de l'URI est déterminé comme étant "http", alors il crée une instance de HttpWebRequest. S'il s'agit de "ftp", il créera une instance de FtpWebRequest. En utilisant "as", la variable webRequest est typée comme une instance de HttpWebRequest et donc les propriétés et méthodes spécifiques à cette classe seront disponibles. Est-ce clair? Je nommerais la variable httpWebRequest (juste pour être plus clair).

0 votes

Il s'agit de la documentation MSDN pour cela, juste au cas où. msdn.microsoft.com/en-us/library/bw00b1dc.aspx

1voto

Sandeep Points 68

C'est juste un exemple de comment poster des données Json et obtenir des données Json vers/depuis une API Rest dans BIDS 2008 en utilisant System.Net.WebRequest et sans utiliser newtonsoft. Il s'agit simplement d'un code d'exemple et peut certainement être affiné (bien testé et fonctionne et sert mon objectif de test à merveille). C'est juste pour vous donner une idée. Je voulais ce fil mais je n'ai pas pu le trouver, donc je le publie. Ce sont mes principales sources à partir desquelles j'ai extrait ceci. Lien 1 et Lien 2

Code qui fonctionne(testé unitairement)

           //Exemple de requête GET
            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 = "nomUtilisateurPourVotreAPI";
            var password = "motDePassePourVotreAPI";

            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, "résultat de la lecture du flux", result, "", 0, ref fireagain);
            }

            //Exemple de requête POST
            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));

            //DONNÉES POST newtonsoft n'a pas fonctionné avec BIDS 2008 dans ce package de test
            //json https://stackoverflow.com/questions/6201529/how-do-i-turn-a-c-sharp-object-into-a-json-string-in-net
            // remplir le modèle de fichier avec des données de test
            CSharpComplexClass fileModel = new CSharpComplexClass();
            fileModel.CarrierID = 2;
            fileModel.InvoiceFileDate = DateTime.Now;
            fileModel.EntryMethodID = EntryMethod.Manuel;
            fileModel.InvoiceFileStatusID = FileStatus.NeedsReview;
            fileModel.CreateUserID = "37f18f01-da45-4d7c-a586-97a0277440ef";
            string json = new JavaScriptSerializer().Serialize(fileModel);
            Dts.Events.FireInformation(3, "atteint du json", json, "", 0, ref fireagain);
            byte[] byteArray = Encoding.UTF8.GetBytes(json);
            httpWebRequestPost.ContentLength = byteArray.Length;
            // Obtenir le flux de demande.  
            Stream dataStream = httpWebRequestPost.GetRequestStream();
            // Écrire les données dans le flux de demande.  
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Fermer l'objet Stream.  
            dataStream.Close();
            // Obtenir la réponse.  
            WebResponse response = httpWebRequestPost.GetResponse();
            // Afficher le statut.  
            //Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            Dts.Events.FireInformation(3, "Afficher le statut", ((HttpWebResponse)response).StatusDescription, "", 0, ref fireagain);
            // Obtenir le flux contenant le contenu renvoyé par le serveur.  
            dataStream = response.GetResponseStream();
            // Ouvrir le flux en utilisant un StreamReader pour un accès facile.  
            StreamReader reader = new StreamReader(dataStream);
            // Lire le contenu.  
            string responseFromServer = reader.ReadToEnd();
            Dts.Events.FireInformation(3, "réponseDuServeur ", responseFromServer, "", 0, ref fireagain);

Références dans ma tâche de script de test à l'intérieur de BIDS 2008 (avec SP1 et le framework 3.5) entrer la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X