Apex에서 bit.ly REST API 호출
Sep 08 2020
이 코드를 통해 Bit.ly V4 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를 테스트 할 때는 .NET Framework와 같은 명령 줄 클라이언트를 사용하는 것이 좋습니다 curl.