首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让HTTP请求在Flutter web中工作?

如何让HTTP请求在Flutter web中工作?
EN

Stack Overflow用户
提问于 2019-10-25 18:53:40
回答 2查看 13.8K关注 0票数 5

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

以下是我的代码

代码语言:javascript
复制
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;
  }
}

但它不起作用。当我运行它时,网页应用程序中断,当我使用断点时,它显示blinding.dart的文件调用

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-28 20:37:14

欢迎使用堆栈溢出:)。

优先:

我在你的代码中发现了一些打字错误。

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

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

Second:

修复上述问题后,您可能会遇到跨域请求(CORS)错误,这可能是因为您尚未在服务器中进行设置。尤其是当flutter web应用程序与运行api的服务器不在同一个域中运行时。即使它在同一台机器上,您也必须允许来自某些域和端口的请求。如果你不知道CORS,你可以阅读here

第三:

正如我所看到的,您在处理响应时没有检查响应的statusCode,当您尝试解码响应时,这仍然会导致错误。

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

代码语言:javascript
复制
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的响应。

票数 6
EN

Stack Overflow用户

发布于 2020-01-29 11:58:53

我也有同样的问题。这与CORS有关。我把这个添加到我的后端服务器上

代码语言:javascript
复制
sudo a2enmod headers

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

如下所示修改:

代码语言:javascript
复制
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

然后重新启动apache2

代码语言:javascript
复制
sudo service apache2 restart
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58557173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档