Usuário com melhor resposta
Consumir API externa com HttpWebRequest

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
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.
- Editado Juliano Nunes Silva Oliveira sexta-feira, 17 de novembro de 2017 21:16
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 20 de novembro de 2017 12:34
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.
-
-
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.
-
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
-
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.
- Editado Juliano Nunes Silva Oliveira sexta-feira, 17 de novembro de 2017 21:16
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 20 de novembro de 2017 12:34
-
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
-
-