【问题标题】:Flutter: Send JSON body for Http GET requestFlutter:为 Http GET 请求发送 JSON 正文
【发布时间】:2019-08-15 08:08:16
【问题描述】:

我需要从我的 Flutter 应用程序向 API 发出 GET 请求,该请求要求请求正文为 JSON(原始)。

我在 Postman 中使用 JSON 请求正文测试了 API,它似乎工作正常。

现在在我的 Flutter 应用程序上,我正在尝试做同样的事情:

_fetchDoctorAvailability() async {
    var params = {
      "doctor_id": "DOC000506",
      "date_range": "25/03/2019-25/03/2019" ,
      "clinic_id":"LAD000404"
    };

    Uri uri = Uri.parse("http://theapiiamcalling:8000");
    uri.replace(queryParameters: params);

    var response = await http.get(uri, headers: {
      "Authorization": Constants.APPOINTMENT_TEST_AUTHORIZATION_KEY,
      HttpHeaders.contentTypeHeader: "application/json",
      "callMethod" : "DOCTOR_AVAILABILITY"
    });

    print('---- status code: ${response.statusCode}');
    var jsonData = json.decode(response.body);

    print('---- slot: ${jsonData}');
}

但是 API 给了我一个错误提示

{message: Missing input json., status: false}

如何在 Flutter 中为 Http GET 请求发送原始(或者更确切地说是 JSON)请求正文?

【问题讨论】:

    标签: json dart flutter


    【解决方案1】:

    获取

    GET 请求不用于向服务器发送数据(而是see this)。这就是http.dart get 方法没有body 参数的原因。但是,当您要指定从服务器获取的内容时,有时您需要包含查询参数,这是一种数据形式。查询参数是键值对,因此您可以像这样将它们包含为映射:

    final queryParameters = {
      'name': 'Bob',
      'age': '87',
    };
    final uri = Uri.http('www.example.com', '/path', queryParameters);
    final headers = {HttpHeaders.contentTypeHeader: 'application/json'};
    final response = await http.get(uri, headers: headers);
    

    发布

    与 GET 请求不同,POST 请求用于在正文中发送数据。你可以这样做:

    final body = {
      'name': 'Bob',
      'age': '87',
    };
    final jsonString = json.encode(body);
    final uri = Uri.http('www.example.com', '/path');
    final headers = {HttpHeaders.contentTypeHeader: 'application/json'};
    final response = await http.post(uri, headers: headers, body: jsonString);
    

    请注意,参数是 Dart 端的 Map。然后它们被 dart:convert 库中的 json.encode() 函数转换为 JSON 字符串。该字符串是 POST 正文。

    因此,如果服务器要求您在 GET 请求正文中向其传递数据,请再次检查。虽然可以用这种方式设计服务器,但这不是标准的。

    【讨论】:

      【解决方案2】:

      uri.replace... 返回一个新的Uri,所以你必须将它赋值给一个新的变量或者直接使用到get 函数中。

      final newURI = uri.replace(queryParameters: params);
      
      var response = await http.get(newURI, headers: {
        "Authorization": Constants.APPOINTMENT_TEST_AUTHORIZATION_KEY,
        HttpHeaders.contentTypeHeader: "application/json",
        "callMethod" : "DOCTOR_AVAILABILITY"
      });
      

      使用帖子:

            var params = {
              "doctor_id": "DOC000506",
              "date_range": "25/03/2019-25/03/2019" ,
              "clinic_id":"LAD000404"
            };
      
            var response = await http.post("http://theapiiamcalling:8000", 
            body: json.encode(params)
            ,headers: {
              "Authorization": Constants.APPOINTMENT_TEST_AUTHORIZATION_KEY,
              HttpHeaders.contentTypeHeader: "application/json",
              "callMethod" : "DOCTOR_AVAILABILITY"
            });
      

      【讨论】:

      • 谢谢,现在我不再收到该错误消息,但响应正文返回为空。
      • 也许您应该使用 post 而不是 get 来发送原始数据。
      • @diegoveloper 如果我们想提交一些数据,我们可以在 get 请求中使用 post 请求中的 body 标签吗?当我以相同的方式发送数据时,我在服务器上接收参数作为查询字符串,例如:someUrl.com/method?param=1 等等......
      • @diegoveloper:在我看到参数 的每个地方,如果我必须发送 bool,int 也是如此。我该怎么做?
      • 最终 uriL = Uri.http('10.130.34.165:4002/masterRequest','/Get_IFSCDetail' ,queryParameters);在我的代码中,我通过了这个但是给出了 FormatException 的错误:无效的 radix-10 数字
      【解决方案3】:

      如果您想通过如下示例的 GET 请求发送复杂/嵌套数据,您可以使用我在 github 上创建的一个简单类 https://github.com/opatajoshua/SimplifiedUri

      final params = {
        'name': 'John',
        'columns': ['firstName', 'lastName'],
        'ageRange': {
          'from': 12,
          'to': 60,
        },
        'someInnerArray': [1,2,3,5]
      };
      final Uri uri = SimplifiedUri.uri('http://api.mysite.com/users', params);
      final headers = {HttpHeaders.contentTypeHeader: 'application/json'};
      final response = await http.get(uri, headers: headers);
      

      输出

      http://api.mysite.com/users?name=John&columns%5B%5D=firstName&columns%5B%5D=lastName&ageRange%5Bfrom%5D=12&ageRange%5Bto%5D=60&someInnerArray%5B%5D=1&someInnerArray%5B%5D=2&someInnerArray%5B%5D=3&someInnerArray%5B%5D=5
      
      

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        • 2020-04-30
        • 2021-02-17
        • 2021-06-27
        • 1970-01-01
        • 2019-05-07
        相关资源
        最近更新 更多