我有一个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;。
答案 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代码以使用apikey
或APIKEY
,然后获得403。
(请注意,HTTPS没有区别,您可以使用HTTP获得相同的结果。)
看起来您需要将此报告为Kreta的错误。