Chiamata API REST bit.ly da Apex

Sep 08 2020

Utilizzando Bit.ly V4 API tramite questo codice:

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

restituisce la seguente risposta:

CALLOUT_RESPONSE [24] | System.HttpResponse [Status = Not Acceptable, StatusCode = 406]

La stessa richiesta funziona in Postman. Perché non funziona in Apex?

Risposte

2 identigral Sep 09 2020 at 00:42

Il tuo frammento di codice

Http http2 = new Http();
HttpResponse res2 = http2.send(req2);           
system.debug(res2);

invia il riferimento ( res2) al registro di debug. Quando ciò accade, SF chiama il toString()metodo sul riferimento e vedi System.HttpResponse [Status = Not Acceptable, StatusCode = 406]come risultato. toStringti dà il nome della classe e la stringa di stato + il codice associato. Non sono informazioni sufficienti per vedere cosa sta succedendo.

Se invii il corpo della risposta al log di debug oltre allo stato in questo modo

system.debug(res2.getStatusCode() + ': ' + res2.getBody());

vedresti

<timestamp> USER_DEBUG [12]|DEBUG|406: {"message":"INVALID_ACCEPT_HEADER"}

Questo ti dice praticamente cosa c'è che non va: devi includere l' Acceptintestazione per indicare che il tuo cliente può accettare JSON come risposta. Funziona:

...
req2.setHeader('Accept', 'application/json');

Http http2 = new Http();
HttpResponse res2 = http2.send(req2);           
system.debug(res2.getStatusCode() + ': ' + res2.getBody());

A seconda della configurazione, Postman può aggiungere automaticamente intestazioni alla richiesta. Anche se sembrava che la tua richiesta in Postman fosse la stessa di Apex, in realtà non lo era. Quando si testano le API REST, è meglio utilizzare un client della riga di comando come curl.