【发布时间】:2022-02-12 00:30:02
【问题描述】:
我正在尝试联系 GraphQL API 并在 Flutter 中检索数据
我有一个邮递员的工作电话,将数据返回给我。
我被提到了一个工作 http 调用的示例,但无法让主体工作。我在邮递员电话中使用了编码版本,但被建议取消编码邮递员电话的"data-raw",并将Json 传递到query。
我有主要的query,然后是variable,即lat/long
A)这是正确的方法吗,使用纯 Json 而不是像我的邮递员调用中那样编码(下面的示例)
{"query":"query ($lat: Float!, $lng: Float!) {\n vehicles(lat: $lat, lng: $lng) {\n id\n...
B) 如果这样做是正确的,我怎样才能将查询和变量放入Map data =?
这就是我所在的位置,在 Map data = 中使用未编码的 Json,该 Json 未被接受,$lat $long 未从 variables 转移到 query
Future<http.Response> showMicroMob () async {
var url ='https://flow-api.fluctuo.com/v1?access_token=my_token';
Map data = {
'query': query ($lat: Float!, $lng: Float!) {
vehicles (lat: $lat, lng: $lng) {
id
type
publicId
provider {
slug
}
lat
lng
propulsion
battery
attributes
... on Station {
isVirtual
availableVehicles
availableStands
stationVehicleDetails {
vehicleType
propulsion
availableVehicles
}
vehicles {
id
publicId
type
propulsion
battery
}
}
}
}
'variables': {"lat":51.492591,"lng":-0.157221}
};
//encode Map to JSON
var body = json.encode(data);
var response = await http.post(Uri.parse(url),
headers: {"Content-Type": "application/json"},
body: body
);
print("${response.statusCode}");
print("${response.body}");
return response;
}
原始示例
Future<http.Response> postRequest () async {
var url ='https://pae.ipportalegre.pt/testes2/wsjson/api/app/ws-authenticate';
Map data = {
'apikey': '12345678901234567890'
}
//encode Map to JSON
var body = json.encode(data);
var response = await http.post(url,
headers: {"Content-Type": "application/json"},
body: body
);
print("${response.statusCode}");
print("${response.body}");
return response;
}
通话更新
如果我将变量向上移动以生成完整的字符串,它不再将 $lat $long 字段或实际的 lat/long 数字识别为值,并将它们变为橙色文本。当我像在邮递员请求中那样向下移动变量时,它当然会引发错误,但数字会被识别为这样($Lat/$Long 仍然无法获取该值。尝试将 lat/ling 数字放入并返回
flutter: 400 flutter: Bad Request
我应该尝试以其他方式传递变量吗?
Future<http.Response> showMicroMob () async {
var url ='https://flow-api.fluctuo.com/v1?access_token=x';
var response = await http.post(Uri.parse(url),
headers: {"Content-Type": "application/json"},
body: utf8.encode(r'{"query":"query ($lat: Float!, $lng: Float!) {\n vehicles(lat: $lat, lng: $lng) {\n id\n lat\n lng\n type\n publicId\n attributes\n propulsion\n battery\n provider {\n name\n slug\n website\n discountCode\n app {\n android\n ios\n __typename\n }\n deepLink {\n android\n ios\n __typename\n }\n stationVehicleTypes\n __typename\n }\n pricing {\n currency\n unlock\n perKm {\n start\n interval\n price\n __typename\n }\n perMin {\n start\n interval\n price\n __typename\n }\n perMinPause {\n start\n interval\n price\n __typename\n }\n includeVat\n __typename\n }\n ... on Station {\n availableVehicles\n availableStands\n isVirtual\n stationVehicleDetails {\n vehicleType\n propulsion\n availableVehicles\n __typename\n }\n __typename\n }\n ... on Car {\n carClass\n carModel\n __typename\n }\n __typename\n }\n}\n"
,"variables":{"lat":51.492591,"lng":-0.157221}}'));
print("${response.statusCode}");
print("${response.body}");
return response;
}
【问题讨论】:
-
您可以构建一个
Map<String, dynamic>然后json.encode它,但是如果您的json 非常简单并且没有太大变化,那么您真的没有理由不将它构建为字符串然后做body: utf8.encode(myHandCraftedJsonString), -
要将其构建为字符串,如何构建查询和变量(经纬度)?我是否将它们放在一个字符串中以成为
body:?谢谢 -
(以原始格式添加了我成功的邮递员调用正文的更新)
-
将刚刚更新的整个字符串粘贴到
body: utf8.encode(r'{"query......221}}'), -
谢谢,已经这样做了,并尝试了很多方法让它发挥作用,但没有成功。更新了我站在哪里的问题,以防你看到我做错了什么。谢谢