проблема с флаттером и отправкой http-запроса для аутентификации на сервере nginx с помощью flask

#flutter #dart #uwsgi #restful-authentication #flask-restful

#флаттер #dart #uwsgi #restful-аутентификация #flask-restful

Вопрос:

Я тестирую написание rest-api в Flask в сочетании с мобильным клиентом flutter. У меня проблема с аутентификацией с помощью Flask-JWT. Я использую ngnix и uwsgi для запуска приложения flask в Ubuntu 20.04. В режиме отладки приложения flask оно работает без проблем.

С Postman это работает всегда. Код Flutter dart:

       Future<String> authRequest() async {
        try {
          final HttpClient client = HttpClient();
          client.badCertificateCallback =
              ((X509Certificate cert, String host, int port) =>
                  true); // accept all certificat
          final Map login = {
            "username": "user",
            "password": "goodsecret",
          };
      
          final request = await client.postUrl(Uri.parse(ProviderBase.url   '/auth'));
          request.headers.add(HttpHeaders.contentTypeHeader, "application/json");
          request.add(utf8.encode(json.encode(login)));
      
          final response = await request.close();
          final reply = await response.transform(utf8.decoder).join();
          final jresponse = json.decode(reply);
      
          ProviderBase.authtoken = jresponse['access_token'];
          print('token: ${ProviderBase.authtoken}');
        } catch (error) {
          print('Error: ${error.toString()}');
        }
      }
  

Я получаю это сообщение об ошибке (ответ) в flutter:

       "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
      <title>400 Bad Request</title>
      <h1>Bad Request</h1>
      <p>The browser (or proxy) sent a request that this server could not understand.</p>"
  

Может быть, у кого-то есть идея?
На данный момент я использую самозаверяющий сертификат.

Ответ №1:

Я нашел решение: это недостающая длина содержимого заголовка. С веб-сервером это необходимо.

это работает для меня:

 ...
final body = utf8.encode(json.encode(login));
request.headers.add(HttpHeaders.contentTypeHeader, "application/json");
request.headers.add(HttpHeaders.contentLengthHeader, body.length.toString());
request.add(body);
...