使用 Flutter 连接到 Yahoo Finance API

问题描述

我正在尝试在我的 Flutter 应用程序中连接到 Yahoo Finance API,但无法连接。 我已经看到了以不同语言连接到 API 的指南,但没有针对 Dart 语言的官方指南。

我有以下方法连接到 API:

   Future<double> getStockPrice(String symbol) async {
    //var client = http.Client();
    var url = 'https://apidojo-yahoo-finance-v1.p.rapidapi.com';
    var apiStr = "/stock/v2/get-summary";
    var headers = {'x-rapidapi-key': "809135c7c7mshf35d1107bf50919p15c9fajsn37166d6b1bfc",'x-rapidapi-host': "apidojo-yahoo-finance-v1.p.rapidapi.com"};
    var params = {'symbol': 'AMRN','region': 'US'};

    var response = await http.get(Uri.https(url,apiStr,params),headers: headers);
    //https://apidojo-yahoo-finance-v1.p.rapidapi.com/stock/v2/get-summary?symbol=AMRN&region=US
    //var response = await http.get(Uri.https(url,params));
    print('RESPONSE STATUS code: ${response.statusCode}');
    if (response.statusCode == 200) {
      print('RESPONSE STATUS code: ${response.statusCode}');
      var json = jsonDecode(response.body);
      String value = json['price']['regularMarketopen']['raw'];
      return double.parse(value);
    } else {
      return 0.0;
    }
  }

我从这个方法中得到了空值。我想这可能是获取值变量的问题,也许我没有正确遍历 JSON 树。但我不明白为什么。

然后我在以下屏幕中从 API 检索数据:

import 'package:Flutter/material.dart';
import 'package:stock_analyzer/api_method/webService.dart';
class TestScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Future<String> test = YahooFinanceService().getWebSite('symbol');
    return Scaffold(
      appBar: AppBar(
        title: Text('test'),),body: Column(
        mainAxisAlignment: MainAxisAlignment.center,children: [
          FutureBuilder<String>(
              future: test,builder: (context,AsyncSnapshot<String> snapshot){
                return Text('Result: ${snapshot.data}');
              })
        ],);
  }
}

在这个屏幕中,我得到了空值。所以,snapshot.data = null

谢谢

解决方法

401 错误表明您无权进行 post 请求,我认为错误是您正在执行 post 而不是 get。

尝试改变:

var response = await client.post(url,body: headers);

致:

var response = await client.get(url,headers: headers);