【问题标题】:How to build Json 'body' of http call to API如何构建对 API 的 http 调用的 Json“主体”
【发布时间】: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&lt;String, dynamic&gt; 然后json.encode 它,但是如果您的json 非常简单并且没有太大变化,那么您真的没有理由不将它构建为字符串然后做body: utf8.encode(myHandCraftedJsonString),
  • 要将其构建为字符串,如何构建查询和变量(经纬度)?我是否将它们放在一个字符串中以成为body:?谢谢
  • (以原始格式添加了我成功的邮递员调用正文的更新)
  • 将刚刚更新的整个字符串粘贴到body: utf8.encode(r'{"query......221}}'),
  • 谢谢,已经这样做了,并尝试了很多方法让它发挥作用,但没有成功。更新了我站在哪里的问题,以防你看到我做错了什么。谢谢

标签: json flutter dart


【解决方案1】:

您的原始字符串中有很多错别字。以下内容有效,并回答了您之前关于如何通过 JSON 构建的问题(作为替代方案)。

import 'dart:convert';
import 'package:http/http.dart' as http;

void main() async {
  {
    var url = 'https://flow-api.fluctuo.com/v1'
        '?access_token=eOy6L54RIbbswB8O0gQgk3lChcCu2wco';

    final encodedQuery1 = r'''{
  "query": "query ($lat: Float!, $lng: Float!) {vehicles(lat: $lat, lng: $lng) {  id  lat   lng   type   publicId   attributes  propulsion  battery  provider {   name  slug     website      discountCode     app {      android      ios      __typename     }     deepLink {        android      ios       __typename      }      stationVehicleTypes      __typename    }    pricing {      currency      unlock      perKm {        start        interval        price        __typename      }      perMin {        start        interval        price        __typename      }      perMinPause {        start        interval        price        __typename      }      includeVat      __typename    }    ... on Station {      availableVehicles      availableStands      isVirtual      stationVehicleDetails {        vehicleType        propulsion        availableVehicles        __typename      }      __typename    }    ... on Car {      carClass      carModel      __typename    }    __typename  }}  ",
  "variables": {
    "lat": 51.492591,
    "lng": -0.157221
  }
}
''';

    // ALTERNATIVE way to build the json
    final lat = 51.492591;
    final long = -0.157221;
    final gqlQuery =
        r'query ($lat: Float!, $lng: Float!) {vehicles(lat: $lat, lng: $lng) {  id  lat   lng   type   publicId   attributes  propulsion  battery  provider {   name  slug     website      discountCode     app {      android      ios      __typename     }     deepLink {        android      ios       __typename      }      stationVehicleTypes      __typename    }    pricing {      currency      unlock      perKm {        start        interval        price        __typename      }      perMin {        start        interval        price        __typename      }      perMinPause {        start        interval        price        __typename      }      includeVat      __typename    }    ... on Station {      availableVehicles      availableStands      isVirtual      stationVehicleDetails {        vehicleType        propulsion        availableVehicles        __typename      }      __typename    }    ... on Car {      carClass      carModel      __typename    }    __typename  }}';
    final encodedQuery2 = json.encode({
      'query': gqlQuery,
      'variables': {'lat': lat, 'lng': long},
    });
    // END of alternative

    var response = await http.post(
      Uri.parse(url),
      headers: {'Content-Type': 'application/json'},
      body: utf8.encode(encodedQuery1), // to use the alternative replace 1 w/ 2
    );

    print('${response.statusCode}');
    print('${response.body}');
  }
}

【讨论】:

    【解决方案2】:

    复制您的回复并将其转至quicktype.ioquicktype 会给你一个模型类。

    【讨论】:

    • 请不要破坏您的帖子。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本,因此,任何破坏行为都将被撤销。如果您想了解有关删除帖子的更多信息,请参阅:How does deleting work?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多