Я реализую обертку R вокруг PiCloud's REST API с использованием пакета RCurl, чтобы сделать запросы HTTP (S) сервером API. API использует базовую HTTP-аутентификацию для проверки наличия у пользователей достаточных разрешений. Документация PiCloud приведен пример использования API и аутентификации с завитком:RCURL: HTTP-аутентификация, когда сайт отвечает протоколом HTTP 401 без WWW-аутентификации
$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12
Это прекрасно работает. Переводя это команда эквивалентного RCurl в:
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret")
Выполнения этой функции я получаю следующее сообщение об ошибке:
[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}"
Исследуя вопрос более подробно, я обнаружил, что запросы HTTP, сделанный завиток команд включены поле авторизации в первой команде GET.
RCURL не делает этого. Вместо этого он сначала отправляет запрос GET без установленного поля авторизации. Если он получает код ошибки 401 И ответ с полем WWW-аутентификация, он отправляет другой запрос GET с полем авторизации.
Хотя спецификация HTTP требует сообщений, которые возвращаются с кодом ошибки 401, чтобы включить поле WWW-Authenticate, сообщения API PiCloud этого не делают. Таким образом, при вызове getURL
даже с параметром userpwd RCURl никогда не отправит запрос GET с установленным полем авторизации. В результате аутентификация всегда будет терпеть неудачу.
Есть ли способ заставить RCURL установить поле авторизации в первом отправляемом GET сообщении? Если нет других пакетов R, которые я мог бы использовать в использовании?
Я пытался отслеживать это вниз в течение нескольких часов. Благодаря! –
Если вы переходите в ручку curl, которую можно использовать повторно, вы должны установить 'httpauth = 1' в своем вызове' getCurlHandle() '. (Это был единственный способ получить 'postForm()' для работы с базовым auth: передача 'httpauth' в качестве параметра' postForm() 'не работала.) –