【问题标题】:How to get response body with request.send() in dart如何在 dart 中使用 request.send() 获取响应正文
【发布时间】:2019-08-26 11:57:16
【问题描述】:

我正在做一个上传图片的 api 请求

var request = new http.MultipartRequest("POST", uri);
var response = await request.send()

在飞镖中使用颤振。然后我可以检查响应代码,例如

if (response.statusCode == 200) {
   print('ok');
}

通过其他调用,我也可以获得响应正文

var result = response.body;

但是在使用 request.send() 时,我似乎无法找到如何获取响应正文结果。

非常感谢任何帮助或输入,谢谢!

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    所以这是我预期的 json 对象:

     {"hasErrors":true,"errorMessage":"Some Error Message","done":false}
    

    基于 'hasErrors' 属性,我想执行一些操作。

    这是我从 Http Post Request 中获取它的方式:

      var request = http.Request('POST', url);
      request.body = json.encode(data);
      request.headers.addAll(headers);
    
      var streamedResponse = await request.send();
      var response = await http.Response.fromStream(streamedResponse);
      final result = jsonDecode(response.body) as Map<String, dynamic>;
      return !result['hasErrors'];
    

    【讨论】:

    • 节省了我的时间。这是我与 Laravel json 错误响应一起使用的流式请求。
    【解决方案2】:

    对我有用的是,

    await res.stream.transform(utf8.decoder).transform(json.decoder).first;
    

    【讨论】:

      【解决方案3】:

      您的MultipartRequest 返回Streamed Response,因为您使用了request.send。您需要从响应中提取字符串值,如下所示:

      import 'package:http/http.dart'
      
      var request = new MultipartRequest("POST", uri);
      var response = await request.send()
      
      // Extract String from Streamed Response
      var responseString = await response.stream.bytesToString();
      

      在这种情况下,responseString 就像 response.body 的一样

      final response = await post(URL, body : map);
      

      【讨论】:

        【解决方案4】:

        只需使用http.Response.fromStream()

        import 'package:http/http.dart' as http;
        
        var streamedResponse = await request.send()
        var response = await http.Response.fromStream(streamedResponse);
        

        【讨论】:

        • 嗨,使用这种方法 print(resBody); bank_name = resBody['data']['BankName'];但得到错误未处理的异常:NoSuchMethodError:方法'[]'在null上被调用。 E/flutter (13761):接收者:null E/flutter (13761):尝试调用:[]("BankName")
        【解决方案5】:

        你可以在第一次响应后施放,看:

        var postUri = Uri.parse("http://my-api.com/updatePhoto");
        var request = new http.MultipartRequest("POST", postUri);
        
        request.fields['user_id'] = user_id
        
        request.files.add(await http.MultipartFile.fromPath(
          'photo',
          myPhoto.absolute.path,
          contentType: new MediaType('application', 'x-tar'),
        ));
        
        request.send().then((result) async {
        
          http.Response.fromStream(result)
              .then((response) {
        
            if (response.statusCode == 200)
            {
              print("Uploaded! ");
              print('response.body '+response.body);
            }
        
            return response.body;
        
          });
        }).catchError((err) => print('error : '+err.toString()))
            .whenComplete(()
        {});
        

        【讨论】:

          【解决方案6】:

          我检查了request.send 的文档,我返回Future&lt;StreamedResponse&gt; 而不是Future&lt;Response&gt;

          StreamedResponse 挖掘更多内容,我发现response.streamByteStream

          这是你可以做些什么来获得字符串中的响应

          final response = await request.send();
          final respStr = await response.stream.bytesToString();
          

          在我看来,如果您想要流式响应而不是“收集”响应,则应该只使用 request.send。更多关于streams in dart here

          【讨论】:

          • 官方文档希望您使用 send 进行行为组合(重试请求、设置用户代理等)。这可能就是为什么大多数人最终不得不从 StreamedResponse 中解封装他们的响应...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-30
          • 1970-01-01
          • 2021-02-02
          • 2017-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多