DIO 响应解码问题

Posted

技术标签:

【中文标题】DIO 响应解码问题【英文标题】:DIO response decode issue 【发布时间】:2019-06-19 08:33:26 【问题描述】:

我正在使用Dio 发出HTTP 请求

  var dio = Dio();
    var response =
        await dio.get(URL);
    final responseBody = json.decode(response.data);

    final statusCode = response.statusCode;

    if (statusCode != 200 || responseBody == null) 
      print("status code:$statusCode");
      throw new ServerExceptionHandler(
          "An error ocurred : [Status Code : $statusCode]", statusCode);
    

我正在处理的响应


"x_id": "home"

但是json.decode(response.data) 正在抛出异常。

type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'

奇怪的是,当我将 Dio 替换为 http.get(url) 然后 json.decode(response.body) 与相同的响应完美配合

【问题讨论】:

看看this是否有帮助。 试过不行 您能提供您想要获取的网址吗?或者至少可以使用邮递员获取 json e 将其格式化为您的问题? 更新了 JSON 响应 好的,知道了。写下我的答案。 【参考方案1】:

遵循这种方法 将响应作为字符串。现在你可以解码了...

 Response<String> response = await DioUtils.getInstance().get(JSON_API);
 List responseJson = json.decode(response.data);
 return responseJson.map((m) => new User.fromJson(m)).toList();

【讨论】:

【参考方案2】:

您的响应数据已经是一个地图,因此您可以简单地这样做:

var response = await dio.get(_url);
var responseBody = response.data;
print(responseBody);

这是显式类型:

Response<Map> response = await dio.get(_url);
Map responseBody = response.data;
print(responseBody);

【讨论】:

是的,它正在工作,DIO 返回解码后的 MAP。不需要解码 @RahulDevanavar 是的。在这种情况下(JSON 正文)就是这样。作为参考,请查看 toString 中的response.dart repo 代码。如果您愿意,也可以进行此检查,但我猜对于 JSON 正文,响应将始终是 Map

以上是关于DIO 响应解码问题的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 使用 http 响应头缓存 JSON 响应

Swift Json 响应解码

正确解码服务器响应[重复]

解码 JSON 响应

无法解码 JSON 响应

使用 Struct 解码 JSON 响应的 Alamofire 错误