Apexからbit.lyRESTAPIを呼び出す

Sep 08 2020

このコードを介してBit.lyV4 APIを使用する:

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

次の応答が得られます。

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

同じリクエストがPostmanでも機能します。なぜApexで機能しないのですか?

回答

2 identigral Sep 09 2020 at 00:42

コードスニペット

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

参照(res2)をデバッグログに送信します。これが発生すると、SFはtoString()参照のメソッドを呼び出しSystem.HttpResponse [Status = Not Acceptable, StatusCode = 406]、結果として表示されます。toStringクラス名とステータス文字列+関連コードを提供します。それは何が起こっているのかを知るのに十分な情報ではありません。

このようなステータスに加えて、応答の本文をデバッグログに送信する場合

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

あなたが見るだろう

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

これは、何が問題なのかをほぼAccept示しています。クライアントが応答としてJSONを受け入れることができることを示すためにヘッダーを含める必要があります。これは機能します:

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

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

構成によっては、Postmanがリクエストにヘッダーを自動的に追加する場合があります。PostmanでのリクエストはApexでのリクエストと同じように見えましたが、実際にはそうではありませんでした。REST APIをテストするときは、などのコマンドラインクライアントを使用することをお勧めしますcurl。