Chamando bit.ly REST API do Apex

Sep 08 2020

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

2 identigral Sep 09 2020 at 00:42

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.