API Flutter + Chopper POST не работает в сети

Я совершенно новичок в трепете. Во время изучения флаттера я не могу войти в систему с веб-приложением флаттера, тот же код отлично работает с мобильным приложением для Android.

Пожалуйста, найдите информацию о журнале ниже. Такой же вызов работает на всех платформах, кроме Flutter Web.

ИНФОРМАЦИЯ: 2020-05-22 17:40:48.229: curl -v -X POST -H 'тип содержимого: приложение / json; charset = UTF-8 '-H' Accept: /'-H' Cache-Control: no-cache '-H' Connection: keep-alive '-d' {"username": "admin", "password": " admin @ 123 "}" http://healthvedic.in/api/admin/user/login.php

Ожидаемое значение типа String, но получено значение типа ClientException.

import 'package:chopper/chopper.dart';

part 'chopper_network_manager.chopper.dart';

@ChopperApi(baseUrl: '')
abstract class ChopperNetworkManager extends ChopperService {
  static ChopperNetworkManager manager;

  @Post(path: 'admin/user/login.php')
  Future<Response> doLogin(@Body() Map<String, dynamic> body);

  static var customHeaders = {
    'content-type': 'application/json; charset=UTF-8',
    'Accept': '*/*',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
  };

  static ChopperNetworkManager create() {
    final client = ChopperClient(
        baseUrl: 'http://healthvedic.in/api/',
        services: [
          _$ChopperNetworkManager(),
        ],
        converter: JsonConverter(),
        interceptors: [
          HeadersInterceptor(customHeaders),
          CurlInterceptor(),
        ]);
    return _$ChopperNetworkManager(client);
  }

  static ChopperNetworkManagergetInstance() {
    if (manager == null) {
      manager = ChopperNetworkManager.create();
      return manager;
    }
    return manager;
  }
}

Место вызова

 void doLogin() async {
LoginReqModel reqModel = LoginReqModel(
    username: userNameController.text, password: passwordController.text);
var res = ChopperNetworkManager.getInstance().doLogin(reqModel.toJson());
res.then(
    (value) => {
          updateOnUI(LoginResModel.fromJson(value.body)),
        }, onError: (e) {
  onError(e);
}).catchError(onError, test: (error) => onError(error));
res.catchError(onError(''));

}

Ниже приведены заголовки в PHP Rest-API.

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, Access-Control-Allow-Origin");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST, OPTIONS");

1 ответ

Я не могу запустить предоставленный вами код, но указанная ошибка довольно ясна: The expected value of type 'String', but got one of type 'ClientException'. Как упоминалось в сообщении об ошибке, он ожидает "String", но вместо этого было сгенерировано исключение.

В комментариях вы упомянули, что строка, вызывающая проблему, была

      res.then((value) => { 
    updateOnUI(LoginResModel.fromJson(value.body)), 
}

Поскольку приложение отлично работает в Android, но не в Интернете, я предлагаю проверить запрос, сделанный в LoginResModel, и выяснить, почему было создано исключение ClientException. Добавление try-catch блок также может помочь.

      try {
    // line causing the issue
} catch (error){
    debugPrint('Error: $error');
}

Мне любопытно, почему ClientException выбрасывается из ChopperNetworkManager.getInstance().doLogin(reqModel.toJson()), возможно, вы сможете поймать исключение внутри doLogin() и определите его причину.

Другие вопросы по тегам