h_houtarou
h_houtarou

Reputation: 57

How to send large json data inside the body of http post

I need to send a large object with my post method. but it kept giving me error.

Future getResults() async {
    var res = await http.post('$SERVER_IP/api/anything/search',
    headers: {'Authorization': token, "Accept": "application/json"}, 
    body: {
      "name": "",
      "type": "",
      "organization": "",
      "state": "CA",
      "appliesTo": {
        "Camp": "true",
        "Fees": "false",
        "Lessons": "false",
      },
    }).catchError((e) => print({"error": e}));
    return json.decode(res.body);
  }

I realized that body only accept Map<String, String>. So I added json.encode to my "appliesTo" object.

Future getResults() async {
    var res = await http.post('$SERVER_IP/api/anything/search',
    headers: {'Authorization': token, "Accept": "application/json"}, 
    body: {
      "name": "",
      "type": "",
      "organization": "",
      "state": "CA",
      "appliesTo": json.encode({
        "Camp": "true",
        "Fees": "false",
        "Lessons": "false",
      }),
    }).catchError((e) => print({"error": e}));
    return json.decode(res.body);
  }

After that it worked and I got a returned data. But my server was ignoring whole "appliesTo" object. So I didn't get the expected data. it's not a problem in my server. I tested it with postman. this flutter http post is not sending proper json body. So my question is how to attatch large object to the body? was using json.encode at the middle of the object wrong? what is the proper way of doing it? can anyone help? PS: I wraped the whole Map with json.encode and it gave me error

Upvotes: 1

Views: 2723

Answers (1)

just95
just95

Reputation: 1099

The documentation of the http package states that

If body is a Map, it's encoded as form fields using encoding. The content-type of the request will be set to "application/x-www-form-urlencoded"; this cannot be overridden.

If you want to send JSON data instead, you have to encode the body manually. Since the content type defaults to text/plain if body is a String, you also have to set the Content-Type header explicitly.

http.post('$SERVER_IP/api/anything/search',
    headers: {
      'Authorization': token, 
      "Accept": "application/json", 
      "Content-Type": "application/json"
    }, 
    body: json.encode({
      "name": "",
      "type": "",
      "organization": "",
      "state": "CA",
      "appliesTo": {
        "Camp": "true",
        "Fees": "false",
        "Lessons": "false",
      },
    }))

Upvotes: 2

Related Questions