Api Request 使用 Http 请求获取 get 方法。但不知道 Flutter 中的实际问题

Posted

技术标签:

【中文标题】Api Request 使用 Http 请求获取 get 方法。但不知道 Flutter 中的实际问题【英文标题】:Api Request using Http request for get method. but don't know actual problem in Flutter 【发布时间】:2021-11-07 02:10:21 【问题描述】:

我是 Flutter 和学习 api 请求的新手。我请求获取方法。但它显示错误!我收不到任何数据!

在 Postman 中,它工作正常,数据正常!

此api和token仅用于测试porpuse!所以,别担心!

API 请求

Future fetchAlbum() async 
  final token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjI4OTksImlzcyI6Imh0dHBzOi8vcG9ydGFsLWFwaS5qb21ha2hhdGEuY29tL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNjMxMjUxNjYwLCJleHAiOjE2MzEzMzgwNjAsIm5iZiI6MTYzMTI1MTY2MCwianRpIjoiNlFEUTZCYnBMT0JhdUJoaSJ9.jAY_2nYxjgsIvXZY5vn0vAr_pwF6UBYbSGZ8wqD0YPQ';
  final response = await http.get(
    Uri.parse('https://portal-api.jomakhata.com/api/getLeaveDetails?token=$token'),
    // Send authorization headers to the backend.
  );
  final responseJson = jsonDecode(response.body);

  if(response.statusCode==200)
    print("ok");
    print(responseJson);
  
  else
    print("error!");
  

  return responseJson;

控制台出错

D/EGL_emulation(19932): app_time_stats: avg=14700.05ms min=577.55ms max=28822.55ms count=2
E/flutter (19932): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: FormatException: Unexpected character (at character 335)
E/flutter (19932): ...ning":14],"fiscalYear":"2021-2022""message":"SQLSTATE[22001]: String ...
E/flutter (19932):                                        ^
E/flutter (19932): 
E/flutter (19932): #0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1404:5)
E/flutter (19932): #1      _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:869:48)
E/flutter (19932): #2      _parseJson (dart:convert-patch/convert_patch.dart:40:10)
E/flutter (19932): #3      JsonDecoder.convert (dart:convert/json.dart:506:36)
E/flutter (19932): #4      JsonCodec.decode (dart:convert/json.dart:157:41)
E/flutter (19932): #5      jsonDecode (dart:convert/json.dart:96:10)
E/flutter (19932): #6      fetchAlbum (package:test_list/main.dart:51:24)
E/flutter (19932): <asynchronous suspension>
E/flutter (19932): 

【问题讨论】:

如果您从 API 获取数据,请参考我的回答 here 或 here 或 here 或 here 希望对您有所帮助 【参考方案1】:

您调用的 API 端点有错误,更准确地说是 SQL 错误SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'url' at row 1

因此,在 JSON 输出中插入一条错误消息,如下所示:


    "message": ...

这不是 Postman 显示的问题,但结果是你得到一个无效的 JSON, 之间应该有一个 ,

所以当你尝试在 Flutter 中解码时,会报错,因为转换失败:Unhandled Exception: FormatException: Unexpected character

【讨论】:

欢迎。更深入地看,根本原因是带有令牌的 URL 太长。错误来自INSERT 到某种想要存储 URL 的日志文件,其中包含令牌。长度为 1046 个字符,无法插入到数据库字段中。 请看这个(下面的链接)问题。我认为这个问题也来自后端!和json格式问题对吗? ***.com/questions/69133085/… 完全一样。 SQL 失败并在输出 JSON 中注入错误消息,使其无效。 谢谢。但它发生在你所说的长 URL 上。这是真的。但如果我想使用... Future fetchAlbum() async final response = await http.get( Uri.parse('jsonplaceholder.typicode.com/albums/1'), headers: HttpHeaders.authorizationHeader: 'Basic your_api_token_here', , );最终 responseJson = jsonDecode(response.body); return Album.fromJson(respons 它不起作用。但是如果我使用查询参数,它就会起作用,例如“url?token=",所以,如果我想使用上面的代码使我的 url 更小,它会显示“未定义的索引: 令牌" 如果后端需要token int URL 查询字符串,而您无法获得更短的令牌,则无法真正解决此问题。它尝试保存到日志表,但 URL 列没有足够的字符来存储更长的 URL。

以上是关于Api Request 使用 Http 请求获取 get 方法。但不知道 Flutter 中的实际问题的主要内容,如果未能解决你的问题,请参考以下文章

无法使用来自axios请求的request.form在flask api中获取请求正文[重复]

javaweb学习总结--http协议

python之使用request模块发送post和get请求

NodeJShttp请求获取get和post参数

HTTP请求主体

flask中通过request获取请求的url信息