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

Posted

技术标签:

【中文标题】Flutter + Chopper POST API 在网络中不起作用【英文标题】:Flutter + Chopper POST API not working in web 【发布时间】:2020-09-09 06:55:10 【问题描述】:

我对 Flutter 完全陌生。在学习颤振时,我无法使用颤振 Web 应用程序登录,相同的代码在 android 移动应用程序中运行良好。

请查看以下日志信息。除了 Flutter Web 之外,所有平台上都可以使用相同的调用

信息:2020-05-22 17:40:48.229: curl -v -X POST -H 'content-type: application/json; charset=UTF-8' -H 'Accept: /' -H 'Cache-Control: no-cache' -H 'Connection: keep-alive' -d '"username":"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");

【问题讨论】:

能否分享一些代码 sn-ps,例如引发异常的行或函数 感谢@ShubhamTanwar 的回复:我已经更新了代码。请检查,如果需要任何信息,请告诉我。 能否请您突出显示引发此异常的行 发生错误我收到错误日志:res.then( (value) => updateOnUI(LoginResModel.fromJson(value.body)), , onError: (e) 您可能应该检查ClientException,看看它告诉您什么。底层的 http 客户端在 web 和 native 上是不同的,所以可能会有一些不同的处理。 【参考方案1】:

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

在 cmets 上,您提到导致问题的线路是

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() 中捕获异常并确定其原因。

【讨论】:

以上是关于Flutter + Chopper POST API 在网络中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Dart Flutter - 使用 Chopper 获取 WordPress 自定义帖子类型

文件上传漏洞总结

为啥 Flutter 中的 BloCListener 不保存状态,认证过程中出现 setState() 问题?

在颤振中使用 MVP 架构的 Chopper

在颤动中使用 Chopper 库将 JSON 响应转换为模型对象?

在 vk_chopper 上使用 cmake 时出错