Memanggil REST API bit.ly dari Apex
Menggunakan Bit.ly V4 API melalui kode ini:
HttpRequest req2 = new HttpRequest();
req2.setEndpoint('https://api-ssl.bitly.com/v4/shorten');
req2.setMethod('POST');
req2.setHeader('Authorization', 'Bearer ...');
String jsonBody = '{"long_url":"https://test.com"}';
req2.setBody(jsonBody);
req2.setHeader('Content-Type', 'application/json');
Http http2 = new Http();
HttpResponse res2 = http2.send(req2);
system.debug(res2);
menghasilkan tanggapan berikut:
CALLOUT_RESPONSE [24] | System.HttpResponse [Status = Not Acceptable, StatusCode = 406]
Permintaan yang sama bekerja di Postman. Mengapa tidak berfungsi di Apex?
Jawaban
Cuplikan kode Anda
Http http2 = new Http();
HttpResponse res2 = http2.send(req2);
system.debug(res2);
mengirim referensi ( res2) ke log debug. Jika ini terjadi, SF memanggil toString()metode pada referensi dan Anda melihat System.HttpResponse [Status = Not Acceptable, StatusCode = 406]hasilnya. toStringmemberi Anda nama kelas dan status string + kode terkait. Informasi itu tidak cukup untuk melihat apa yang sedang terjadi.
Jika Anda mengirim respons tubuh ke log debug selain status seperti itu
system.debug(res2.getStatusCode() + ': ' + res2.getBody());
Anda akan melihat
<timestamp> USER_DEBUG [12]|DEBUG|406: {"message":"INVALID_ACCEPT_HEADER"}
Ini cukup banyak memberi tahu Anda apa yang salah - Anda perlu menyertakan Accepttajuk untuk menunjukkan bahwa klien Anda dapat menerima JSON sebagai respons. Ini bekerja:
...
req2.setHeader('Accept', 'application/json');
Http http2 = new Http();
HttpResponse res2 = http2.send(req2);
system.debug(res2.getStatusCode() + ': ' + res2.getBody());
Bergantung pada konfigurasi, Postman dapat secara otomatis menambahkan header ke permintaan tersebut. Meskipun tampaknya permintaan Anda di Postman sama dengan di Apex, sebenarnya tidak. Saat menguji REST API, lebih baik menggunakan klien baris perintah seperti curl.