Chamando bit.ly REST API do Apex
Usando a API Bit.ly V4 por meio deste código:
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);
produz a seguinte resposta:
CALLOUT_RESPONSE [24] | System.HttpResponse [Status = Not Acceptable, StatusCode = 406]
A mesma solicitação funciona no Postman. Por que não funciona no Apex?
Respostas
Seu snippet de código
Http http2 = new Http();
HttpResponse res2 = http2.send(req2);
system.debug(res2);
envia a referência ( res2) para o log de depuração. Quando isso acontece, o SF chama o toString()método na referência e você vê System.HttpResponse [Status = Not Acceptable, StatusCode = 406]como o resultado. toStringfornece o nome da classe e a string de status + código associado. Isso não é informação suficiente para ver o que está acontecendo.
Se você enviar o corpo da resposta para o log de depuração, além do status como tal
system.debug(res2.getStatusCode() + ': ' + res2.getBody());
você veria
<timestamp> USER_DEBUG [12]|DEBUG|406: {"message":"INVALID_ACCEPT_HEADER"}
Isso basicamente diz o que está errado - você precisa incluir o Acceptcabeçalho para indicar que seu cliente pode aceitar JSON como a resposta. Isso funciona:
...
req2.setHeader('Accept', 'application/json');
Http http2 = new Http();
HttpResponse res2 = http2.send(req2);
system.debug(res2.getStatusCode() + ': ' + res2.getBody());
Dependendo da configuração, o Postman pode adicionar cabeçalhos automaticamente à solicitação. Embora parecesse que o seu pedido no Postman era o mesmo que no Apex, realmente não era. Ao testar APIs REST, é melhor usar um cliente de linha de comando como curl.