Comment puis-je envoyer arbitraire de données JSON, avec un en-tête personnalisé, pour un REPOS serveur?

StackOverflow https://stackoverflow.com//questions/21057354

Question

TL;DR-Comment puis-je envoyer une chaîne JSON à un RESTE d'accueil avec un en-tête d'authentification?J'ai essayé 3 approches différentes trouvé un qui fonctionne avec les types anonymes.Pourquoi ne puis-je pas utiliser les types anonymes?J'ai besoin de définir une variable appelée "Groupe-Nom", et un trait d'union n'est pas valide en C# identificateur.

Arrière-plan

J'ai besoin de mettre JSON, mais je suis incapable d'obtenir le corps et le type de contenu correct

La fonction n ° 1 - Fonctionne avec les types anonymes

Le type de contenu et de données est correct, mais je ne veux pas utiliser les types anonymes.Je veux utiliser une chaîne de caractères

  static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody)
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(restURLBase);
        client.DefaultRequestHeaders.Add("Auth-Token", AuthToken);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        // StringContent content = new StringContent(postBody);

        var test1 = "data1";
        var test2 = "data2";
        var test3 = "data3";

        var response = client.PostAsJsonAsync(RESTUrl, new { test1, test2, test3}).Result;  // Blocking call!
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            return;
        } 
    }

Sortie n ° 1

Type de contenu et de données est correct lors de l'utilisation de AnonymousTypes + PostAsJsonAsync, mais je ne veux pas utiliser les types anonymes.

POST https://api.dynect.net/REST/Zone/ABCqqqqqqqqqqqqYYYYYtes3ss.com HTTP/1.1
Auth-Token: --- REDACTED -----
Accept: application/json
Content-Type: application/json; charset=utf-8
Host: api.dynect.net
Content-Length: 49
Expect: 100-continue

{"test1":"data1","test2":"data2","test3":"data3"}

La fonction n ° 2 - Ne fonctionne pas comme prévu

Prendre une corde et le mettre dans un StringContent objet.Cela a un effet secondaire de changer le type de contenu.

  static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody)
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(restURLBase);
        client.DefaultRequestHeaders.Add("Auth-Token", AuthToken);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        StringContent content = new StringContent(postBody);

        var response = client.PostAsync(RESTUrl, content).Result;  // Blocking call!
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            return;
        } 
    }

Sortie n ° 2

Type de contenu est incorrect lors de l'utilisation de StringContent + PostAsync

POST https://api.dynect.net/REST/Zone/ABCqqqqqqqqqqqqYYYYYtes3ss.com HTTP/1.1
Auth-Token: ---- REDACTED -------
Accept: application/json                      // CORRECT
Content-Type: text/plain; charset=utf-8       // WRONG!!!
Host: api.dynect.net
Content-Length: 100
Expect: 100-continue

{"rdata" : ["rname" : "dynect.nfp.com", "zone" : "ABCqqqqqqqqqqqqYYYYYtes3ss.com"], "ttl" : "43200"}
        // ^^ THIS IS CORRECT

Fonction n ° 3 - Ne pas fonctionner comme prévu

Depuis que je sais PostAsJsonAsync définit le contentType correctement, permet d'utiliser cette méthode.(ne fonctionne pas)

    static void PostData(string restURLBase, string RESTUrl, string AuthToken, string postBody)
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(restURLBase);
        client.DefaultRequestHeaders.Add("Auth-Token", AuthToken);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        StringContent content = new StringContent(postBody);

        var response = client.PostAsJsonAsync(RESTUrl, content).Result;  // Blocking call!
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            return;
        } 
    }

Sortie n ° 3

Type de contenu est correct, corps POST est erroné lors de l'utilisation de StringContent + PostAsJsonAsync

POST https://api.dynect.net/REST/Zone/ABCqqqqqqqqqqqqYYYYYtes3ss.com HTTP/1.1
Auth-Token: -- REDACTED ---
Accept: application/json
Content-Type: application/json; charset=utf-8
Host: api.dynect.net
Content-Length: 74
Expect: 100-continue

{"Headers":[{"Key":"Content-Type","Value":["text/plain; charset=utf-8"]}]}

Question

Tout ce que je veux faire est d'envoyer JSON comme une chaîne de caractères, ou de la dynamique de l'objet défini au moment de l'exécution, d'un serveur HTTP de type de contenu est correct, et avec un spécial "Auth-Jeton" en-tête.

Un exemple, si vous n'utilisez pas WebAPI, comme servicestack, ou autre chose c'est cool.

Était-ce utile?

La solution

/// <summary>
    /// Creates a new instance of the <see cref="T:System.Net.Http.StringContent"/> class.
    /// </summary>
    /// <param name="content">The content used to initialize the <see cref="T:System.Net.Http.StringContent"/>.</param><param name="encoding">The encoding to use for the content.</param><param name="mediaType">The media type to use for the content.</param>
    [__DynamicallyInvokable]
    public StringContent(string content, Encoding encoding, string mediaType)
      : base(StringContent.GetContentByteArray(content, encoding))
    {
      this.Headers.ContentType = new MediaTypeHeaderValue(mediaType == null ? "text/plain" : mediaType)
      {
        CharSet = encoding == null ? HttpContent.DefaultStringEncoding.WebName : encoding.WebName
      };
    }

Il est constructeur de StringContent.Ressemble que vous devez spécifier l'Encodage approprié et mediaType

Autres conseils

Vous ne pouvez pas directement l'installation d'une instance de HttpContent, parce que c'est une classe abstraite.Vous devez utiliser l'un des sous-classes en fonction de votre besoin.Le plus probable StringContent, qui vous permet de définir la chaîne de valeur de la réponse, le codage, et le type de support dans le constructeur: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

Réponse de Comment puis-je configurer HttpContent pour mon HttpClient PostAsync deuxième paramètre?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top