devarthurribeiro / covid19-brazil-api

API com dados atualizados sobre o status do COVID-19 🦠
https://covid19-brazil-api.now.sh
MIT License
297 stars 45 forks source link

System.Net.WebException - Quando tento consumir sua API #28

Closed MardSilva closed 4 years ago

MardSilva commented 4 years ago

Olá, estou adicionando agora os dados para uma aplicação em destkop, que estou desenvolvendo. E, gostei da estrutura do seu JSON. Porém, ao tentar dar o GET usando o seu link da API (vi no seu Insomnia) ele dá o erro: System.Net.WebException: 'A solicitação foi anulada: Não foi possível criar um canal seguro para SSL/TLS.'

O link que estou usando: https://covid19-brazil-api.now.sh/api/report/v1

Entretanto, verifiquei, e, já adiconei ambos os protocolos (SSL/TLS), já tentei adicionar certificado de usuário para poder validar, e até mesmo coloquei minhas credenciais (caso seja algo ligado a credentials) para sua API. Porém, não consigo obter os dados.

Poderia verificar?!

devarthurribeiro commented 4 years ago

Pode colocar um print do erro ?

MardSilva commented 4 years ago

Opa, segue aí: https://imgur.com/a/YuSEyXp

devarthurribeiro commented 4 years ago

Parece um erro no cliente que você usou e não na API. Coloca o trecho de código que faz a request aqui.

MardSilva commented 4 years ago

Segue o trecho:

private string BaixarDadosBrasilGeralAPI()
        {
            try
            {
                string strLink = DadosAPI.strAPIDadosGeraisBrasil;
                string strRetornoAPI;

                Uri novoUrl = new Uri(strLink);

                HttpWebRequest requisicaoHTTP = WebRequest.Create(novoUrl) as HttpWebRequest;
                requisicaoHTTP.Method = "GET";
                requisicaoHTTP.ContentType = "application/json";

                using (HttpWebResponse respostaHTTP = requisicaoHTTP.GetResponse() as HttpWebResponse)
                {
                    StreamReader novoLeitorStream = new StreamReader(respostaHTTP.GetResponseStream());
                    strRetornoAPI = novoLeitorStream.ReadToEnd();

                    return strRetornoAPI;
                }
            }
            catch
            {
                MessageBox.Show("Não foi possível obter os dados da API nesse momento.", "Confirmação", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

Não é erro no cliente, estou quase certo disso. Nota: o DadosAPI.strLink... é o link que mencionei quando abri a issue. Eu usei 3 clientes diferentes. E o mesmo erro ocorre. E esse inclusive, é o mais recente do 4.5/4.6.

devarthurribeiro commented 4 years ago

Teste assim

private string BaixarDadosBrasilGeralAPI()
        {
            try
            {
                string strLink = DadosAPI.strAPIDadosGeraisBrasil;
                string strRetornoAPI;

                Uri novoUrl = new Uri(strLink);

                HttpWebRequest requisicaoHTTP = WebRequest.Create(novoUrl) as HttpWebRequest;
                requisicaoHTTP.Method = "GET";
               ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
               ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

                requisicaoHTTP.ContentType = "application/json";

                using (HttpWebResponse respostaHTTP = requisicaoHTTP.GetResponse() as HttpWebResponse)
                {
                    StreamReader novoLeitorStream = new StreamReader(respostaHTTP.GetResponseStream());
                    strRetornoAPI = novoLeitorStream.ReadToEnd();

                    return strRetornoAPI;
                }
            }
            catch
            {
                MessageBox.Show("Não foi possível obter os dados da API nesse momento.", "Confirmação", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
MardSilva commented 4 years ago

Certo. Tentei sem o delegate. Vou fazer as alterações, com o delegate. Eu já havia usado o ProtocolType.Ss13;. Já te informo!

devarthurribeiro commented 4 years ago

Caso não funcione, adicione as três linhas de código a seguir antes de criar o objeto HttpWebRequest:

const SslProtocols _Tls12 = (SslProtocols)0x00000C00;
const SecurityProtocolType Tls12 = (SecurityProtocolType)_Tls12;
 ServicePointManager.SecurityProtocol = Tls12;
MardSilva commented 4 years ago

OLOCO, agora me explique porque antes adicionaria isso? Resolvido com esse seu ajuste do último ponto. Agora consigo terminar de fazer os requests e deserializar!

devarthurribeiro commented 4 years ago

Mano essa não é minha área hehehe, eu só usei bem o Google e achei esse post -> https://community.developer.authorize.net/t5/Integration-and-Testing/Could-not-create-SSL-TLS-secure-channel/td-p/63016

Assim que li o erro já sabia que era problema no client.

MardSilva commented 4 years ago

Agora já entendi o porquê..mas é impressionante. Não cheguei a pensar nisto. De qualquer forma, valeu pelo auxílio. Se quiser te mandarei um link diretamente só pra testar com seus dados da API pra desktop.

Valeu!