0

I am making POST request using http lib in Dart. After I wandering around former answers with no luck. Even official doc

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

Future<http.Response> createAlbum(String nameEN) {
  return http.post(
    'http://localhost:8000/api/products/',
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, String>{
      'nameEN': nameEN,
    }),
  );
}

And I test with unittest like this

  testWidgets('POST request from offcial docs', (WidgetTester tester) async{
    final http.Response res = await createAlbum("Jordan");
    print(res.statusCode);
  });

Attempt:
PostmanApp can make request and get 201 in response. However, when I copy&paste the Dart code from it and test it does not work I always get 400 and no request comes to localhost:8000

testWidgets('POST request from postman', (WidgetTester tester) async{
    var headers = {
      'Content-Type': 'application/json'
    };
    var request = http.Request('POST', Uri.parse('localhost:8000/api/products/'));
    request.body = '''{\n    "name_jp": "李天宝",\n    "name_en": "Sarit",\n    "description": "Developer",\n    "qty": 3,\n    "expiry": "2099-12-25",\n    "barcode": "549XXXYYYYYY",\n    "price": "{\\"bounds\\": \\"[)\\", \\"lower\\": \\"12\\", \\"upper\\": \\"6\\"}",\n    "medium_price": 60\n}''';
    request.headers.addAll(headers);

    http.StreamedResponse response = await request.send();

    if (response.statusCode == 200) {
      print(200);
      print(await response.stream.bytesToString());
    }
    else {
      print(response.statusCode);
      print(response.reasonPhrase);
    }
  });

Problem
Dart response returned to me is 400 and on the server side request has not been sent out to my http://localhost:8000/api/products/

Question:
What is the correct POST syntax?

References:

HTTP POST with Json on Body - Flutter/Dart

Bad state: Cannot set the body fields of a Request with content-type "application/json"

Flutter FormatException: Unexpected character (at character 1)

Http POST request with json content-type in dart:io

joe
  • 8,383
  • 13
  • 61
  • 109

2 Answers2

0

You have non-ASCII characters. Did you set the proper ; charset=UTF-8 in your Content-Type header? Or even better, JSON doesn't understand non-ASCII unless you \u encode them.

Randal Schwartz
  • 39,428
  • 4
  • 43
  • 70
0

Lesson learnt here

  1. Add CORS enable in chrome
  2. flutter run -d web. Do not use -d chrome
  3. Make request from cors enabled chrome by clicking. Do not use unittest!
joe
  • 8,383
  • 13
  • 61
  • 109