2
respostas

Requisições a API não apresentam resposta HTTP normal, somente ClientException

Estou aplicando o que aprendi no curso para iniciar um projeto mobile da empreso que trabalho, fazendo requisições a uma API em ".net". Mas quando faço as requisições a API, com as mesmas configurações de um projeto já existente para web, que consome da mesma API, a requisição simplesmente não é completada, e tambem não retorna nenhum erro HTTP, só retorna uma Unhadled Exception:, sem nenhum detalhamento depois, utilizei o cathcError e deu pra ver só que era uma instância de ClientException sem nenhum texo no message e com a propridade url: <url da requisição>.

Estou usando um "Intercepor" como ensinado no curso, mas os únicos print's são os referentes à Requisição, não há retorno nenhum da função que resgata a Resposta. Código ao que me refiro:

class LoggingInterceptor implements InterceptorContract {
  @override
  Future<RequestData> interceptRequest({RequestData data}) async {
    print('Request');
    print('url: ${data.baseUrl}');
    ...
  } // todos os prints ocorrem normalmente

  @override
  Future<ResponseData> interceptResponse({ResponseData data}) async {
    // Nenhum desses print's é mostrado no console
    print('Response');
    print('status: ${data.statusCode}');
    ...
  }
}

Estou utilizando a mesma estrutura de funções ensinada no curso para as requisições. Já testei o mesmo código mudando somente a URL e funcionou normalmente, por exemplo a API de localidades fornecida pelo IBGE, inclusive com um outro projeto a parte da empresa, e também funcionou sem problemas.

A única coisa de diferente que percebi que ocorre, fora do projeto em Flutter, é que quando acesso essa URL, a que não está funcionando no projeto, pelo navegador do celular aparece um popup com uma mensagem:

"nenhum certificado encontrado

O app chrome solicitou um certificado. ... ... O app identificou o servidor da solicitação como <dominio da empresa>:443, mas você só deve permitir acesso ao certificado caso confie no App"

Apesar de não aparecer nada relacionado a isso nos logs do Flutter eu acredito que tenha alguma coisa a ver com o problema.

Essa é a parte do código que está dando problema:

// os headers que são passados como parâmetro no Login:
//  {
//    'Content-Type': 'application/json',
//    'Access-Control-Allow-Origin': '*',
//  }
Future<Response> login(
    Map<String, String> headers,
    Map<String, String> params,
    String endpoint,
  ) async {
    String jsonParams = json.encode(params);
    final response = await client.post(
      Uri.https(baseURL, apiURL + endpoint),
      headers: headers,
      body: jsonParams,
    );

    if (response.statusCode == 200 || response.statusCode == 204)
      return response;

    throw HttpException(getMessage(response.statusCode));
  }
2 respostas

Atualizando ...

Com o pessoal do Backend da empresa, conseguimos "resolver" o problema em questão. Porém pra funcionar, foi preciso mexer nas SSL Settings do servidor, modificar a opção de Client certificates(para ignore).

Mas era preferível deixar como estava antes, pela segurança do serviço, então se houver alguém que saiba adicionar essa configuração na parte do Flutter me ajudaria bastante.

Bom dia Emiliano, beleza?

Então meu caro, no caso de segurança de dados e novos parametros temos de fato que adicionar coisas novas ao código, o que está acontecendo é que seu API precisa de alguns dados para permitir a entrada, não sei muito bem como exatamente você vai dar essas credenciais, mas lembre-se que você tem que criar esse "certificado" e entregar para a API no momento da conexão!

Existe um rapaz que teve um problema parecido com o seu e que eu acho que possa te dar uma luz :) https://stackoverflow.com/questions/52355264/client-certificate-authentication-in-flutter-dart-languege

Se conseguir resolver por completo nos avise aqui!