2012-04-14 1 views
14

RCurl 패키지를 사용하여 PiCloud's REST API 주위에 R 래퍼를 구현하여 API 서버에 HTTP (S) 요청을 수행합니다. API는 기본 HTTP 인증을 사용하여 사용자에게 충분한 권한이 있는지 확인합니다. 이것은 완벽하게 작동RCurl : 사이트가 WWW 인증없이 HTTP 401 코드로 응답 할 때 HTTP 인증

$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12 

다음 PiCloud 문서는 API를 사용하여 컬과 인증의 예를 제공합니다. 나는 다음과 같은 오류 메시지가 나타납니다이 기능을 실행

getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret") 

: 동등한 RCurl의 명령이 번역

[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}" 

더 깊이 문제를 탐험을 나는 curl 명령에 의해 만들어진 HTTP 요청이 포함 된 것을 발견 첫 번째 GET 명령의 Authorization 필드

RCurl은이 작업을 수행하지 않습니다. 대신 권한 필드가 설정되지 않은 채로 GET 요청을 보냅니다. 401 오류 코드와 WWW-Authenticate 필드를 가진 응답을 받으면 Authorization 필드에 다른 GET 요청을 보냅니다.

HTTP 사양에는 401 오류 코드와 함께 WWW-Authenticate 필드를 포함하는 메시지가 필요하지만 PiCloud API 메시지에는 포함되어 있지 않습니다. 따라서 userpwd 옵션으로도 getURL을 호출 할 때 RCurl은 권한 필드가 설정된 GET 요청을 절대로 보내지 않습니다. 결과적으로 인증은 항상 실패합니다.

RCurl이 보낸 첫 번째 GET 메시지에서 권한 부여 필드를 설정하도록하는 방법이 있습니까? 그렇지 않다면 내가 사용할 수있는 다른 R 패키지가 있습니까?

답변

23

나는 RCurl, Duncan Lang의 저자의 도움으로이 문제를 해결했습니다. 해결책은 초기에 인증 메소드를 설정하도록 httpauth 옵션을 명시 적으로 설정하는 것입니다. 작동 방식 :

getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret", httpauth = 1L) 

httpauth는 사용할 인증 방법을 지정하는 비트 마스크입니다. 자세한 내용은 the libcurl tutorial의 HTTP 인증 절을 참조하십시오. HTTR에서

+1

. 감사! –

+0

재사용 가능한 컬 핸들을 건네 주려면'getCurlHandle()'을 호출 할 때'httpauth = 1'을 설정해야합니다. (이것은'postForm()'이 기본 인증을 사용할 수있는 유일한 방법이었습니다.'httpauth'를'postForm()'의 매개 변수로 전달하지 못했습니다.) –

6

등가 코드는 다음과 같습니다 나는 시간이 추적하기 위해 노력했습니다

library(httr) 
GET("https://api.picloud.com/job/?jids=12", authenticate("key", "secret"))