Ошибка API всегда 408 - Отправлен неверный тип данных - PullRequest
0 голосов
/ 08 января 2020

Я действительно не знаю, что происходит с этой ошибкой (я имею в виду, связано ли это с Flutter или Dart или пакетом, который я использовал, или API, который я использовал). В двух словах, он всегда возвращает мне код ошибки 408 - неверный тип данных, отправленный из моего приложения-флаттера, в то время как я ПОЛНОСТЬЮ мог сделать это в Postman и попробовать его с PHP.

Я просто хочу вызвать обычный запрос POST к API моего платежного шлюза (я использую Midtrans).


Вот мой результат:

От Почтальона

From Postman

Из моего приложения во Флаттере в VS Code From my app in Flutter within VS Code


Что я делаю не так? Я совершенно не имею понятия об этом. Ниже я приведу подробности для тех, кто хочет попробовать простой вызов этого API, чтобы вы могли воспроизвести его.

Конечная точка

https://api.sandbox.midtrans.com/v2/charge

Кузов

    "payment_type": "bank_transfer",
    "bank_transfer": {
        "bank": "permata",
        "va_number": "1234567890"
    },
    "transaction_details": {
        "order_id": "order-101b-{{2020-11-0222rrd324dzz}}",
        "gross_amount": 44000
    },
    "customer_details": {
        "email": "richie.permana@gmail.com",
        "first_name": "Richie",
        "last_name": "Permana",
        "phone": "+6281 1234 1234"
    },
    "item_details": [
        {
            "id": "item01",
            "price": 21000,
            "quantity": 1,
            "name": "Schema Programmer"
        },
        {
            "id": "item02",
            "price": 23000,
            "quantity": 1,
            "name": "Ayam Xoxoxo"
        }
    ]
}

Это заголовок

{
  'content-type': 'application/json',
  'accept': 'application/json',
  'authorization':
      'Basic U0ItTWlkLXNlcnZlci1kNnJNbGp5ZDBKSDgyOEhBT28tSWkxM0E=',
  'cache-control': 'no-cache'
}

Фрагмент My Dart Function

Future _makePayment() async {
    String url = "https://api.sandbox.midtrans.com/v2/charge";

    final Map<String, String> header = {
      'content-type': 'application/json',
      'accept': 'application/json',
      'authorization':
          'Basic U0ItTWlkLXNlcnZlci1kNnJNbGp5ZDBKSDgyOEhBT28tSWkxM0E=',
      'cache-control': 'no-cache'
    };

    var json = jsonEncode({
      "payment_type": "bank_transfer",
      "bank_transfer": {"bank": "permata", "va_number": "1234567890"},
      "transaction_details": {
        "order_id": "order-101b-{{2020-11-0222rrddzz557}}",
        "gross_amount": 44000
      },
      "customer_details": {
        "email": "richie@example.com",
        "first_name": "Richie",
        "last_name": "Permana",
        "phone": "+6281 1234 1234"
      },
      "item_details": [
        {
          "id": "item01",
          "price": 21000,
          "quantity": 1,
          "name": "Schema Programmer"
        },
        {"id": "item02", "price": 23000, "quantity": 1, "name": "Ayam Xoxoxo"}
      ]
    });

    Response response = await post(
      url,
      headers: header,
      body: json,
    );


    var res = jsonDecode(response.body);
    print(
        "payloadddded =>> ${json.runtimeType}\n");
    if (res['status_code'] == 201) {
      print("ngeheeeee berhasil MIDTRAANSS =>> ${res['status_code']}");
    } else {
      print("res full =>> ${response.body}");
      print("ape kaden => ${res['status_code']} || terosz => $res");
    }
  }

Примечание:

Для корпуса может потребоваться уделить больше внимания order_id, поскольку он вернет некоторую ошибку, если вы не измените order_id (да, думаю, что это как любой другой идентификатор первичного ключа).

Документы API: https://api-docs.midtrans.com/


Я действительно ценю любую помощь или обходной путь, данный. Большое спасибо.

1 Ответ

2 голосов
/ 09 января 2020

Dart's package:http манипулирует заголовком content-type под капотом. Если он выполняет кодирование от строки к байту для вас (т. Е. Если body является строкой), то он добавляет суффикс charset=xxx к типу содержимого - он становится, например, application/json; charset=utf-8.

Видимо Ваш сервер имеет аллергию c на это. (Так не должно быть, но как угодно ...). Вы можете доказать это с помощью dart:io http-клиента.

  var client = HttpClient();
  var request = await client.postUrl(Uri.parse(url));
  request.headers.set('content-type', 'application/json; charset=utf-8');
  request.headers.add(
    'authorization',
    'Basic U0ItTWlkLXNlcnZlci1kNnJNbGp5ZDBKSDgyOEhBT28tSWkxM0E=',
  );
  request.add(utf8.encode(json));
  var response2 = await request.close();
  var reply = await response2.transform(utf8.decoder).join();
  print(reply);
  client.close();

Это выдает ту же ошибку 408, но не делает, если суффикс кодировки удален.

Есть простое решение. Не позволяйте http кодировать за вас - делайте это сами.

  var response = await http.post(
    url,
    headers: headers,
    body: utf8.encode(json),
  );

(Ваш json, видимо, нуждается в работе, потому что теперь он жалуется, что json недействителен, но это легко сравнить с вашим рабочим почтальоном.)

...