Naprawdę nie wiem, co się dzieje z tym błędem (mam na myśli, czy to związane z trzepotem lub strzałką lub pakietem, który użyłem lub API, którego używałem). W skrócie zawsze daje mi kod błędu wstecz 408 - nieprawidłowe przesyłane typ danych z mojej aplikacji trzepotającej, podczas gdy całkowicie mogłem zrobić to w Listceum i został wypróbowany z PHP.

Chcę tylko zadzwonić do zwykłego żądania pocztowego do mojego bramy płatności API (używam pośrednich).


Oto mój wynik:

Od Postman

From Postman

z mojej aplikacji w trzepotanie w kodzie vs z mojej aplikacji w trzepotanie w kodzie VS


Co ja robię źle? Jestem całkowicie nie ma pojęcia o tym. Podam szczegół poniżej dla każdego, kto chce spróbować prostego wezwania do tego interfejsu API, abyś mógł to odtworzyć.

Punkt końcowy

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

Treść

    "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"
        }
    ]
}

Jest to nagłówek

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

mój fragment funkcji dartów

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");
    }
  }

Uwaga:

Dla organizmu możesz być potrzebny więcej uwagi na order_id, ponieważ zwróci błąd, jeśli nie zmienisz order_id (tak, pomyśl go jak każdy inny identyfikator klucza podstawowego).

API Dokumenty: https://api-docs.midtrans.com/


Naprawdę doceniam jakąkolwiek pomoc lub obejście. Dziękuję Ci bardzo.

0
Richie Permana 8 styczeń 2020, 17:09

1 odpowiedź

Najlepsza odpowiedź

Dart's package:http Manipuluje nagłówek content-type pod maską. Jeśli jest to kodowanie z ciągów do bajtów (tj. Jeśli body jest ciągiem), to dodaje sufiks charset=xxx do typu zawartości - staje się, na przykład application/json; charset=utf-8.

Najwyraźniej twój serwer jest dla tego uczulony. (Nie powinno być, ale cokolwiek ...). Możesz udowodnić to za pomocą klienta HTTP dart:io.

  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();

Daje to ten sam błąd 408, ale nie, jeśli przyrostek zestawu bezpieczeństwa jest usuwany.

Jest proste rozwiązanie. Nie pozwól http, aby zrobić kodowanie dla Ciebie - zrób to sam.

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

(Twój JSON najwyraźniej potrzebuje pracy, ponieważ teraz narzeka, że JSON jest nieprawidłowy, ale łatwo jest porównać ze swoim pracującym listonoszem).

2
Richard Heap 8 styczeń 2020, 21:52