Como faço para enviar arbitrária de dados JSON, com um cabeçalho personalizado, para um DESCANSO servidor?

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

Pergunta

TL;DR-Como faço para enviar uma seqüência de caracteres JSON para um RESTO de host com um cabeçalho de autenticação?Eu tentei 3 diferentes abordagens encontrei um que funciona com os tipos anônimos.Por que não posso usar tipos anônimos?Eu preciso definir uma variável chamada "Nome do Grupo" e o hífen não é válido em C# identificador.

Fundo

Eu preciso de PÓS JSON, mas sou incapaz de obter o corpo e o tipo de conteúdo correto

A função #1 - Trabalha com tipos anônimos

O tipo de conteúdo e de dados está correto, mas eu não quero usar tipos anônimos.Eu quero usar uma seqüência de caracteres

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

Saída #1

Tipo de conteúdo e de dados está correto ao usar o AnonymousTypes + PostAsJsonAsync, mas eu não quero usar tipos anônimos.

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

A função #2 - não funciona como esperado

Dê uma cadeia e colocá-lo em um StringContent objeto.Isso tem um efeito colateral de alterar o tipo de conteúdo.

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

Saída #2

Tipo de conteúdo está errado quando usando 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

A função #3 - não funciona como esperado

Desde que eu sei PostAsJsonAsync define o contentType corretamente, permite utilizar o método.(não funciona)

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

Saída #3

Tipo de conteúdo está correto, o corpo do POST está errado quando usando 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"]}]}

Pergunta

Tudo que eu quero fazer é enviar JSON como uma seqüência de caracteres, ou o objeto dinâmico definido em tempo de execução, para um servidor, com o tipo de conteúdo HTTP correto, e com especial 'Auth-Token' cabeçalho.

Qualquer exemplo, se não for usar o WebAPI, tais como servicestack, ou qualquer outra coisa que é legal.

Foi útil?

Solução

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

Construtor da StringContent.Parece que você deverá especificar a Codificação apropriada e mediaType

Outras dicas

Diretamente você não pode configurar uma instância do HttpContent, porque é uma classe abstrata.Você precisa usar uma das sub-classes, dependendo de sua necessidade.Provavelmente StringContent, que permite que você defina o valor de seqüência de caracteres de resposta, a codificação, e o tipo de mídia em que o construtor: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

Resposta do Como faço para configurar HttpContent para o meu HttpClient PostAsync segundo parâmetro?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top