web-dev-qa-db-fra.com

API Web C # envoyant des données de corps dans HTTP Post REST Client

J'ai besoin d'envoyer cette demande de publication HTTP:

 POST https://webapi.com/baseurl/login
 Content-Type: application/json

 {"Password":"password",
 "AppVersion":"1",
 "AppComments":"",
 "UserName":"username",
 "AppKey":"dakey" 
  }

Cela fonctionne très bien dans RestClient et PostMan, comme ci-dessus.

J'ai besoin de cela de manière pro-grammaticale et je ne suis pas sûr d'utiliser 

WebClient, HTTPRequest ou WebRequest pour accomplir cela.

Le problème est de savoir comment formater le contenu du corps et l’envoyer ci-dessus avec la demande.

Voici où je suis avec exemple de code pour WebClient ...

  private static void Main(string[] args)
    {
        RunPostAsync();
    } 

    static HttpClient client = new HttpClient();

    private static void RunPostAsync(){

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            Inputs inputs = new Inputs();

            inputs.Password = "pw";
            inputs.AppVersion = "apv";
            inputs.AppComments = "apc";
            inputs.UserName = "user";
            inputs.AppKey = "apk";


            var res = client.PostAsync("https://baseuriplus", new StringContent(JsonConvert.SerializeObject(inputs)));

            try
            {
                res.Result.EnsureSuccessStatusCode();

                Console.WriteLine("Response " + res.Result.Content.ReadAsStringAsync().Result + Environment.NewLine);

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error " + res + " Error " + 
                ex.ToString());
            }

        Console.WriteLine("Response: {0}", result);
    }       

    public class Inputs
    {
        public string Password;
        public string AppVersion;
        public string AppComments;
        public string UserName;
        public string AppKey;
    }

Cela fonctionne maintenant et les réponses avec un (200) serveur et réponse OK

4
CraigJSte

Pourquoi générez-vous votre propre JSON? 

Utilisez JSONConvert de JsonNewtonsoft. 

Les valeurs de votre chaîne d’objet json nécessitent " " quotes and ,

J'utiliserais le client HTTP pour la publication, pas le client Web. 

using (var client = new HttpClient())
{
   var res = client.PostAsync("YOUR URL", 
     new StringContent(JSONConvert.serializeObject(
       new { OBJECT DEF HERE },
       Encoding.UTF8, "application/json")
   );

   try
   {
      res.Result.EnsureSuccessStatusCode();
   } 
   catch (Exception e)
   {
     Console.WriteLine(e.ToString());
   }
}   
2
Ya Wang

Vous ne sérialisez pas correctement vos valeurs en JSON avant l'envoi. Au lieu d'essayer de construire la chaîne vous-même, vous devez utiliser une bibliothèque telle que JSON.Net.

Vous pourriez obtenir la bonne chaîne en faisant quelque chose comme ceci:

var message = JsonConvert.SerializeObject(new {Password = pw, AppVersion = apv, AppComments = acm, UserName = user, AppKey = apk});
Console.WriteLine(message); //Output: {"Password":"password","AppVersion":"10","AppComments":"","UserName":"username","AppKey":"dakey"}
0
Jonathon Chase