2014-08-28 3 views
1

Я использую функцию R httr POST для отправки тела jSON в API. API корректно возвращает сообщение 302: Найденное сообщение, но httr выходит из функции, прежде чем я смогу захватить тело ответа (которое является телом jSON с некоторыми ключевыми битами информации.)Подавление 302 Ошибка, возвращаемая httr POST

Запуск HTTR с Многословным() аргументом, следующий ответ:

<- HTTP/1.1 302 Found 
<- Cache-Control: no-cache 
<- Pragma: no-cache 
<- Content-Length: 47 
<- Content-Type: application/json; charset=utf-8 
<- Expires: -1 
Error in function (type, msg, asError = TRUE) : 
    necessary data rewind wasn't possible 

Я запускать тот же Curl пост от терминала, и может подтвердить то, что я посылаю производит ответ от API как с 302 и желаемого тела.

Для справки следует следующий код R. (Примечание: у является JSon отформатирован тела)

POST("https://thewebsite",authenticate("myusername","mypassword",type="basic"), 
    add_headers("Content-Type" = "application/json"), 
    body = y, verbose()) 

Любые мысли о том, как обойти ошибку и захватить содержание 302 сообщений?

+0

Любопытный ... что произойдет, если вы 'PUT' вместо' Post'? Не означает, что это решение - просто для устранения неполадок. – Deryck

+0

Дайте PUT попробовать, и похоже, что это не вариант с этим конкретным API. Выдает ошибку «405: метод не допускается». – TS4

ответ

1

Я просто потратил некоторое время на битву с этой проблемой. Проблема сводится к различию в спецификации HTTP (которая в основном соответствует RCURL) и тем, что на самом деле делают браузеры.

Последовательность событий такова:

  1. Вы запрашиваете вопрос POST на сервер
  2. Сервер обрабатывает запрос и выдает вам перенаправлять на новый адрес
  3. RCurl рассматривает это как новый запрос как POST , и пытается воспроизвести тело. (Браузер не пытается и повторно отправляет данные)
  4. Он не может повторно отправить данные, потому что исходный RCURL не сконструирован таким образом, что это возможно (вот почему завиток жалуется: «необходимая перемотка данных не была возможна «)

решение простое - отключить следующие переадресаций с config(followlocation = 0L):

POST("https://thewebsite", 
    authenticate("myusername","mypassword"), 
    content_type_json(), 
    config(followlocation = 0L), 
    body = y, 
) 

# PS with httr 0.4 you can simplify to 
POST("https://thewebsite", 
    authenticate("myusername","mypassword"), 
    config(followlocation = 0L), 
    body = x, encode = "json" 
) 

затем вам нужно взглянуть на содержимое поля местоположения и сделать самостоятельно перенаправлять.

Для более детального обсуждения основного вопроса см:

+0

Возможно, что 'config (post = TRUE)' также может устранить проблему при обработке запросов, но я не могу подтвердить без воспроизводимого примера – hadley

+0

Блестяще, проблема решена! – TS4

+0

@ TS4 использует 'post = TRUE' вместо' followlocation = 0L' исправляет проблему? – hadley

Смежные вопросы