none
Consumir API externa com HttpWebRequest RRS feed

  • Pergunta

  • Preciso consumir uma API externa e pegar umas informações sendo que quando estou enviando está mostrando o seguinte erro :

    Você deve gravar bytes ContentLength no fluxo de solicitação antes de chamar [Begin]GetResponse.

    Fiz assim :

    ASCIIEncoding encoding = new ASCIIEncoding();
    
    var postdata = "client_id : " + idcliente64 + "\ncliente_secret : " + segredo64;
    
    byte[] byteArray = encoding.GetBytes(postdata);
    
    WebRequest request = WebRequest.Create("minha uri");
    
    request.Credentials = CredentialCache.DefaultCredentials;
    
    request.Headers.Add("Authorization", "Basic headerValue");
    
    request.Method = "POST";
    
    request.ContentType = "application/x-www-form-urlencoded";
                
    request.ContentLength = byteArray.Length;
                Stream dataStream = request.GetRequestStream();
    
    
    WebResponse response = request.GetResponse();
    
    
    


    Junior

    sexta-feira, 17 de novembro de 2017 16:37

Respostas

  • Junior, 

    Você tem algum PDF dessa documentação? Porque tem que ver se há alguma separação entre clientid e clientsecret antes de converter para base64, mas se for num formato tipo clientid: valor clientsecret: valor, tente usando este código pra gerar o cabeçalho Authentication:

    ASCIIEncoding encoding = new ASCIIEncoding();
    
    // Forma a string normal primeiro, sem codificar o id e o segredo
    var auth = "client_id:" + idcliente + " client_secret:" + segredo;
    
    // Agora sim você converte em base64, tudo, inclusive a chave
    var encodedData = System.Convert.ToBase64String(
                        System.Text.Encoding.GetEncoding("ISO-8859-1")
                          .GetBytes(auth)
                        );
    var authorizationHeaderString = "Basic " + encodedData;
    
    string postdata = @"scope: readonly
    grant_type: client_credentials";
    
    byte[] byteArray = encoding.GetBytes(postdata);
    
    WebRequest request = WebRequest.Create("minha uri");
    
    request.Credentials = CredentialCache.DefaultCredentials;
    
    request.Headers.Add("Authorization", authorizationHeaderString);
    
    request.Method = "POST";
    
    request.ContentType = "application/x-www-form-urlencoded";
                
    request.ContentLength = byteArray.Length;
    
    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(postdata);
    }
    
    var response = (HttpWebResponse)request.GetResponse();
    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        Response.Write(reader.ReadToEnd());
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.


    sexta-feira, 17 de novembro de 2017 20:49

Todas as Respostas

  • Tente assim:

    ASCIIEncoding encoding = new ASCIIEncoding();
    
    var postdata = "client_id : " + idcliente64 + "\ncliente_secret : " + segredo64;
    
    byte[] byteArray = encoding.GetBytes(postdata);
    
    WebRequest request = WebRequest.Create("minha uri");
    
    request.Credentials = CredentialCache.DefaultCredentials;
    
    request.Headers.Add("Authorization", "Basic headerValue");
    
    request.Method = "POST";
    
    request.ContentType = "application/x-www-form-urlencoded";
                
    request.ContentLength = byteArray.Length;
    
    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(postdata);
    }
    
    var response = (HttpWebResponse)request.GetResponse();
    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        Response.Write(reader.ReadToEnd());
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    sexta-feira, 17 de novembro de 2017 17:15
  • Fiz a alteração, sendo que agora no response está me dando o seguinte erro :

    O servidor remoto retornou um erro: (400) Solicitação Incorreta.


    Junior

    sexta-feira, 17 de novembro de 2017 17:25
  • Você deve estar passando o postdata na estrutura incorreta ou o valor do Authorization no Header é inválido.

    Tente fazer a solicitação em aplicações como SoapUI ou Postman. No postman ele inclusive gera um exemplo de código para várias linguagens.


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    sexta-feira, 17 de novembro de 2017 17:33
  • Juliano não tem jeito sempre me retorna 400, estou fazendo uma aplicação para consumir o webservice do itau, a documentação é péssima e o suporte nem vou comentar, pela documentação é o seguinte o banco me passou um cliente id e um numero secreto, onde tenho que converter ambos para base64 e passar no body, pelo manual está assim :

    Header:
    Authorization: Basic headerValue
    Content-Type: application/x-www-form-urlencoded
    Body:
    scope: readonly
    grant_type: client_credentials
    (Quebras de linha adicionadas para facilitar a leitura, não enviar aspas na palavra readonlyx)


    Junior

    sexta-feira, 17 de novembro de 2017 18:55
  • Junior, 

    Você tem algum PDF dessa documentação? Porque tem que ver se há alguma separação entre clientid e clientsecret antes de converter para base64, mas se for num formato tipo clientid: valor clientsecret: valor, tente usando este código pra gerar o cabeçalho Authentication:

    ASCIIEncoding encoding = new ASCIIEncoding();
    
    // Forma a string normal primeiro, sem codificar o id e o segredo
    var auth = "client_id:" + idcliente + " client_secret:" + segredo;
    
    // Agora sim você converte em base64, tudo, inclusive a chave
    var encodedData = System.Convert.ToBase64String(
                        System.Text.Encoding.GetEncoding("ISO-8859-1")
                          .GetBytes(auth)
                        );
    var authorizationHeaderString = "Basic " + encodedData;
    
    string postdata = @"scope: readonly
    grant_type: client_credentials";
    
    byte[] byteArray = encoding.GetBytes(postdata);
    
    WebRequest request = WebRequest.Create("minha uri");
    
    request.Credentials = CredentialCache.DefaultCredentials;
    
    request.Headers.Add("Authorization", authorizationHeaderString);
    
    request.Method = "POST";
    
    request.ContentType = "application/x-www-form-urlencoded";
                
    request.ContentLength = byteArray.Length;
    
    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(postdata);
    }
    
    var response = (HttpWebResponse)request.GetResponse();
    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        Response.Write(reader.ReadToEnd());
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.


    sexta-feira, 17 de novembro de 2017 20:49
  • Juliano essa é a minha grande dúvida, porque na documentação do banco tem um print do postman e os dados estão separados, mais em contado com o suporte do banco fui informado que é junto, que para efeito de teste eu informasse o clientid e o segredo que me foi passado e informasse os dois colocando : entre os valores qdo fosse fazer o encode 64. Fiz isso e não deu certo.

    Fiz o postman conforme está no print da documentação(separado os valores) e sempre me dá o mesmo erro clientid inválido, já testei juntos e o erro é o mesmo.

    Vou testar o que vc me mandou, mais estou  fazendo os testes direto no postman eu informando os valores.


    Junior

    sábado, 18 de novembro de 2017 18:51
  • Resolvi com httpclient

    Junior

    quarta-feira, 22 de novembro de 2017 14:23
  • Resolvi com httpclient

    Junior

    Junior, boa tarde!

    Teria como você postar sua solução, estou passando pela mesma situação. 


    Desde já grato. 
    quarta-feira, 30 de junho de 2021 17:20