Зарегистрируйтесь на бэкэнд акведука из интерфейса Flutter

У меня возникли некоторые трудности с регистрацией на сервере акведука из моего интерфейса Flutter.

Вот мой код в моем интерфейсе:

  Future<void> signUp(String email, String password) async {
    final body = "username:$email,password:$password"; //<- return request entity could not be decoded
    //final body = {"username": email, "password": password}; //<- return bad state: Cannot set the body fields of Request with content-type "application/json"

    try {
      final http.Response response = await http.post(
          "http://localhost:8888/register",
          headers: {"Content-Type": "application/json"},
          body: body);
      final jsonResponse = json.decode(response.body);
      if (jsonResponse["error"] != null) {
        throw HttpException(jsonResponse["error"]);
      }
    } catch (error) {
      throw error;
    }
  }

Должна быть какая-то глупая ошибка. Я считаю, что это с форматированием тела, поэтому я попробовал 2 варианта, и оба выдают другое исключение http (как в комментарии).


person delmin    schedule 01.05.2020    source источник


Ответы (1)


Вот пример подключения к серверу Aqueduct из клиента Flutter. (Однако на самом деле это не вопрос сервера, поскольку клиент и сервер не зависят друг от друга.)

Вот пример регистрации:

void _register(String email, String password) async {
  Map<String, String> headers = {"Content-type": "application/json"};
  final jsonString = '{"username":"$email", "password":"$password"}';
  Response response = await post(YOUR_URL_HERE, headers: headers, body: jsonString);
  print('${response.statusCode} ${response.body}');
}

В вашем примере вы неправильно кодируете JSON.

А вот еще один пример входа в систему. Класс - это архитектура модели представления, о которой я говорю здесь.

import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

class LoginViewModel extends ChangeNotifier {

  String _token = '';
  bool _isLoggedIn = false;
  bool get isLoggedIn => _isLoggedIn;
  String get token => _token;

  Future onLoginPressed(String username, String password) async {
    if (username.isEmpty || password.isEmpty) {
      return;
    }
    _isLoggedIn = await _login(username, password);
    notifyListeners();
  }

  Future<bool> _login(String username, String password) async {
    var clientID = 'com.example.app';
    var clientSecret = '';
    var body = 'username=$username&password=$password&grant_type=password';
    var clientCredentials = Base64Encoder().convert('$clientID:$clientSecret'.codeUnits);

    Map<String, String> headers = {
      'Content-type': 'application/x-www-form-urlencoded',
      'authorization': 'Basic $clientCredentials'
    };
    var response = await http.post(YOUR_URL_HERE, headers: headers, body: body);
    final responseBody = response.body;
    if (response.statusCode != 200) {
      return false;
    }

    final map = json.decode(responseBody);
    _token = map['access_token'];
    return true;
  }
}
person Suragch    schedule 01.05.2020
comment
Я действительно знаю о входе в систему .. Я спрашивал о регистрации ... о создании нового пользователя - person delmin; 01.05.2020
comment
Извините, я тоже это понял. - person Suragch; 01.05.2020
comment
@delmin, я обновил свой ответ, но не понимаю, что вы сделали не так. - person Suragch; 01.05.2020
comment
хм ... я тоже ... У меня в основном тот же код, что и у вас, но я все равно получаю эту ошибку. можем ли мы сохранить имя пользователя в формате электронной почты? Это единственная разница в моем коде - person delmin; 01.05.2020
comment
Поняла ... Формат должен быть такой final body = '{"username": "$email", "password": "$password"}'; - person delmin; 01.05.2020
comment
Кстати, вы знаете, как удалить пользователя .. Это просто удаление его из таблицы пользователей? - person delmin; 01.05.2020
comment
@delmin да, я так думаю - person Suragch; 01.05.2020
comment
Я просто играл, чтобы удалить пользователя, удалив его только из таблицы пользователей, но это не очень хорошо работает. Если пользователь вошел в систему или имеет токен, сохраненный на его устройстве, он все еще может войти в систему с этим токеном .. Я думаю, чтобы удалить пользователя, мы должны удалить его из таблицы пользователей, а также удалить весь его токен, который объясняется в вашем вопросе здесь stackoverflow.com/questions/56247509/ - person delmin; 01.05.2020