【问题标题】:How to make HTTP Request work in Flutter web?如何使 HTTP 请求在 Flutter web 中工作?
【发布时间】:2020-02-21 17:26:30
【问题描述】:

我正在尝试从我的站点链接获取数据:http://mrmatjar.com/kaka/dataaza.php

这是我的代码

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:mrmatjar_afflite/shopobj.dart';
class Operations{
 static Future<List<ShopObj>> loly() async{
    List<ShopObj> ak= new List<ShopObj>();
      var res = await http.get(Uri.encodeFull("https://mrmatjar.com/kaka/dataaza"),headers: {"Accept":"application/json"});

    print(res);
    var v = json.decode(x.body);
    for(var h in v){
        ak.add(new ShopObj(h['title'], h['cost'], h['earn'], h['image']));
    }
    return ak;
  }
}

但它不起作用。 当我运行它时,Web 应用程序会中断,当我使用中断点时,它会显示文件调用 致盲飞镖

【问题讨论】:

    标签: http flutter dart httprequest flutter-web


    【解决方案1】:

    欢迎来到堆栈溢出:)。

    第一:

    我在您的代码中看到一些拼写错误。

    var v = json.decode(x.body); 应该是

    var v = json.decode(res.body);

    第二:

    修复上述问题后,您可能会遇到 Cross Origin Request(CORS) 错误,这可能是因为您尚未在服务器中进行设置。特别是如果您的 Flutter Web 应用程序与运行 api 的服务器不在同一个域中运行。即使它在同一台机器上,您也必须允许来自某些域和端口的请求。如果您不了解 CORS,可以阅读 here

    第三:

    正如我所见,您正在处理响应而不检查响应的 statusCode,当您尝试解码响应时,它仍然会导致错误。

    我这里有一个基于DOGs public api 的简单运行示例。

    import 'package:flutter/material.dart';
    import 'dart:convert';
    import 'package:http/http.dart' as http;
    
    class HttpRequestDemo extends StatefulWidget {
      @override
      _HttpRequestDemoState createState() => _HttpRequestDemoState();
    }
    
    class _HttpRequestDemoState extends State<HttpRequestDemo> {
      String imageUrl = "";
    
      @override
      Widget build(BuildContext context) {
        return Container(
            child: Column(
          children: <Widget>[
            Center(
              child: Image.network(
                imageUrl,
                height: MediaQuery.of(context).size.height / 3,
                width: MediaQuery.of(context).size.width / 3,
              ),
            ),
            FloatingActionButton(
              child: Icon(Icons.cloud_download),
              onPressed: () {
                fetchData();
              },
            )
          ],
        ));
      }
    
      fetchData() async {
        final res = await http.get("https://dog.ceo/api/breeds/image/random");
    
        if (res.statusCode == 200) {
          var v = json.decode(res.body);
          setState(() {
            imageUrl = v['message'];
          });
        }
      }
    }
    
    

    每次按下浮动操作按钮时,此应用都会显示一张新的狗照片,如下所示,这是基于 api 的响应。

    【讨论】:

    • 感谢您的帮助。我将这 2 行添加到服务器,它现在可以正常工作 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Credentials: true');再次感谢:3
    • 将这些标头添加到服务器也不起作用
    • 根据服务器,您可能需要添加允许方法以及包括选项
    【解决方案2】:

    我也有同样的问题。它与CORS有关。 我将此添加到我的后端服务器

    sudo a2enmod headers
    
    sudo nano /etc/apache2/mods-enabled/headers.conf
    

    修改如下:

    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
    

    然后重启apache2

    sudo service apache2 restart
    

    【讨论】:

    • 如果您没有权限更改服务器怎么办?
    • @ASADHAMEED,我认为这个问题没有答案。根据我对 CORS 的了解,这是一项安全策略,可确保没有人可以创建一个窃取您服务器的网站。所以如果服务器不允许你访问,你就不能得到它。在这里查看答案:stackoverflow.com/questions/27365303/…
    • @LeviLesches 我深入研究了这个问题,我发现这是浏览器实现“同源策略”的问题,服务器端必须使用以下参数Access-Control-Allow-Origin: * 来允许所有域以访问服务器内容或将其限制为某些域(添加域名而不是 *)。就我而言,服务器端没有设置此参数。
    • 对,如果你对服务器没有控制权,你就无法解决。
    猜你喜欢
    • 2020-08-08
    • 2019-12-11
    • 2019-10-02
    • 2021-03-31
    • 2021-02-23
    • 2019-03-09
    • 2021-03-12
    • 2021-07-07
    • 2020-08-13
    相关资源
    最近更新 更多