Flutter + Chopper POST API在网络中不起作用

时间:2020-05-22 12:20:10

标签: php flutter flutter-web chopper

我完全陌生了。在学习Flutter时,我无法使用Flutter Web应用程序登录,同样的代码在android移动应用程序中也能正常工作。

请找到以下日志信息。相同的调用适用于除flutter web之外的所有平台

INFO:2020-05-22 17:40:48.229:curl -v -X POST -H'content-type:application / json; charset = UTF-8'-H'接受: / '-H'缓存控制:无缓存'-H'连接:keep-alive'-d'{“用户名”:“ admin “,”密码“:” 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 ChopperNetworkManager getInstance() {
    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 个答案:

答案 0 :(得分:0)

我无法运行您提供的代码,但给出的错误非常清楚:The expected value of type 'String', but got one of type 'ClientException'。正如错误中提到的,它需要一个“字符串”,但是却抛出了一个异常。

在评论中,您提到导致问题的行是

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

由于该应用程序在 Android 上运行良好,但在 Web 上运行良好,我建议检查在 LoginResModel 中发出的请求,并了解抛出 ClientException 的原因。添加 try-catch 块也可能有所帮助。

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

我很好奇为什么从 ChopperNetworkManager.getInstance().doLogin(reqModel.toJson()) 抛出 ClientException,也许您可​​以在 doLogin() 中捕获异常并确定其原因。