Flutter返回空字符串 - HTTP(S)GET请求

时间:2018-05-06 12:29:54

标签: android networking get dart flutter

我有一个HTTP(S)GET请求,可以在java(Android sdk)和Python中正常工作,但是当我试图将它移植到颤动时它会返回一个空字符串。 它应该返回一个包含大约2MB数据的JSON。

这是Python代码:

import http.client

HOST, PORT = 'kretaglobalmobileapi.ekreta.hu', 443
headers = {"apiKey": "7856d350-1fda-45f5-822d-e1a2f3f1acf0", "Connection": "keep-alive",
           "Accept": "application/json", "HOST": "kretaglobalmobileapi.ekreta.hu"}

conn = http.client.HTTPSConnection(host=HOST, port=PORT)
conn.request("GET", "/api/v1/Institute", headers=headers)

response = conn.getresponse()

data = response.read()
print(data)

conn.close()

我为Flutter版本尝试了两种不同的方法,但都没有。

第一种方法:

import 'dart:async';
import 'dart:convert' show utf8, json;
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

Future<http.Response> fetchPost() {
  return http.get(
    "https://kretaglobalmobileapi.ekreta.hu/api/v1/Institute",
    // Send authorization headers to your backend
      headers : {"apiKey": "7856d350-1fda-45f5-822d-e1a2f3f1acf0", "Connection": "keep-alive",
        "Accept": "application/json", "HOST": "kretaglobalmobileapi.ekreta.hu"}
  );
}

void login() async {

  print((await fetchPost()).body);
  print((await fetchPost()).body.length);

}

它返回:

Performing full restart...
Restarted app in 3,648ms.
I/flutter (18739): 
I/flutter (18739): 0

第二

Future<Map<String, dynamic>> getInstitutes(HttpClient client) async {
  final String url = "https://kretaglobalmobileapi.ekreta.hu/api/v1/Institute";

  final HttpClientRequest request = await client.getUrl(Uri.parse(url))
    ..headers.add("Accept", "application/json")
    ..headers.add("HOST", "kretaglobalmobileapi.ekreta.hu")
    ..headers.add("apiKey", "7856d350-1fda-45f5-822d-e1a2f3f1acf0")
    ..headers.add("Connection", "keep-alive");

  final HttpClientResponse response = await request.close();
  print(json.decode(await response.join()));

  return json.decode(await response.transform(utf8.decoder).join());
}

我在这里省略了GUI和样板代码,完整的代码在pastebin上。

更新:问题是,我连接的API,使用过时的HTTP标准。我告诉支持者,他们告诉我他们不愿意修复它,所以我将不得不创建一个新的网络服务器(可能在Python中),它将在客户端和API之间运行。另一个选择是使用本机Android和iOS代码,希望支持区分大小写的标头。 嗯,所有这些大惊小怪是因为他们无法改变资本&#39; K&#39;小写&#39; k&#39;。

1 个答案:

答案 0 :(得分:2)

对于任何HTTP请求,最好测试HTTP响应代码。在您的情况下,您将获得403 Forbidden,因此服务器不会接受您的凭据或API密钥。

在您的第一种方法中,您实际上是向服务器发送了两个请求 - 每个请求等待一个。考虑改为:

  http.Response r = await fetchPost();
  print(r.statusCode);
  print(r.body.length);

编辑 - 您的 API密钥未被服务器接受,其行为方式非标准。

Dart HttpClient(在第二种方法中直接使用,间接在第一种方法中使用)恰好小写了所有请求标头。这是完全有效的,因为RFC 7230声明“每个标头字段由不区分大小写的字段名称后跟冒号(”:“),可选的前导空格,字段值和可选字段组成尾随空格。“。

因此,即使您添加标题"apiKey": "7856d...,电汇上的内容也是apikey: 7856d...

但是,(这是你不喜欢的位),似乎HTTP服务器是非标准的,不会接受apikey而不是apiKey。尝试更改Python代码以使用apikeyAPIKEY,然后获得403。

(请注意,HTTPS没有区别,您可以使用HTTP获得相同的结果。)

看起来您需要将此报告为Kreta的错误。