Как заставить HTTP-запрос работать в сети Flutter? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь получить данные из ссылки на Мой сайт: 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;
  }
}

Но он не работает. когда я запускаю его, веб-приложение Breaks и когда я использую точку останова, оно показывает вызов файла по blinding.dart

1 Ответ

0 голосов
/ 28 октября 2019

Добро пожаловать в переполнение стека:).

Первое:

Я вижу в вашем коде ошибку опечатки.

var v = json.decode(x.body); должно быть

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

Секунда:

Как только вы исправите вышеперечисленное, вы можете столкнуться с Cross Origin Request (CORS) errorчто может быть потому, что вы не настроили это на своем сервере. Особенно, если ваше веб-приложение не работает в том же домене, что и сервер, на котором работает API. Даже если он находится на той же машине, вам придется разрешить запрос от определенного домена и портов. Если вы не знаете CORS, вы можете прочитать здесь .

Третий:

Как я вижу, вы обрабатываете ответ без проверки statusCodeответа все равно приведет к ошибке при попытке декодирования ответа.

У меня есть простой пример выполнения, основанный на общедоступном API DOGs .

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.

enter image description here enter image description here

...