POST-запрос с использованием RCurl - PullRequest
16 голосов
/ 27 апреля 2011

В качестве способа изучения того, как создать пакет на R для RUG в Денвере, я решил, что это будет забавный маленький проект - написать оболочку R вокруг API datasciencetoolkit. Как вы можете себе представить, базовые инструменты R поставляются из пакета RCurl. Я застрял на кажущейся простой проблеме и надеюсь, что кто-то на этом форуме сможет указать мне правильное направление. Основная проблема заключается в том, что я не могу использовать postForm () для передачи неключевой строки как части параметра данных в curl, т.е. curl -d "string" "address_to_api".

Например, из командной строки я могу сделать

$ curl -d "Tim O'Reilly, Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people"

с успехом. Однако, похоже, что postForm () требует явного ключа при передаче дополнительных аргументов в запрос POST. Я просмотрел код datasciencetoolkit и документы разработчика на предмет возможного ключа, но, похоже, ничего не нашел.

Кроме того, довольно просто передать входные данные с помощью запроса GET другим частям API-интерфейса DSTK. Например,

ip2coordinates <- function(ip) {
  api <- "http://www.datasciencetoolkit.org/ip2coordinates/"
  result <- getURL(paste(api, URLencode(ip), sep=""))
  names(result) <- "ip"
  return(result)
}
ip2coordinates('67.169.73.113')

даст желаемый результат.

Для ясности, я прочитал документы RCurl на сайте омегахата DTL, документы RCurl с пакетом и справочную страницу curl. Тем не менее, мне не хватает чего-то фундаментального в отношении curl (или, возможно, .opts () в функции postForm ()), и я не могу этого понять.

В python я мог бы в основном сделать «сырой» POST-запрос, используя httplib.HTTPConnection - доступно ли что-то подобное в R? Я также посмотрел на функцию simplePostToHost в пакете httpRequest, и она, казалось, просто заблокировала мою сессию R (кажется, что также требуется ключ).

FWIW, я использую R 2.13.0 на Mac 10.6.7.

Любая помощь очень ценится. Весь код скоро будет доступен на github, если вам интересно поиграть с инструментарием обработки данных.

Приветствие.

Ответы [ 5 ]

18 голосов
/ 31 июля 2014

С httr это просто:

library(httr)
r <- POST("http://www.datasciencetoolkit.org/text2people", 
  body = "Tim O'Reilly, Archbishop Huxley")
stop_for_status(r)
content(r, "parsed", "application/json")
6 голосов
/ 27 апреля 2011

Как правило, в тех случаях, когда вы пытаетесь POST-то, что не является ключом, вы можете просто присвоить этому значению фиктивный ключ. Например:

> postForm("http://www.datasciencetoolkit.org/text2people", a="Archbishop Huxley")
[1] "[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":44,\"end_index\":61,\"matched_string\":\"Archbishop Huxley\"},{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":88,\"end_index\":105,\"matched_string\":\"Archbishop Huxley\"}]"
attr(,"Content-Type")
                charset 
"text/html"     "utf-8" 

Работало бы так же, если бы я использовал b = "Архиепископ Хаксли" и т. Д.

Наслаждайтесь RCurl - это, наверное, мой любимый пакет R. Если вы рискуете, обновление до ~ libcurl 7.21 предоставляет некоторые новые методы через curl (включая SMTP и т. Д.).

2 голосов
/ 30 апреля 2011

Из Duncan Temple Lang в списке R-справки:

postForm () использует другой стиль (или, в частности, Content-Type) для отправки формы, чем команда curl -d.При переключении стиля = 'POST' используется тот же тип, но по быстрому предположению имя параметра 'a' вызывает путаницу, и в результате получается пустой массив JSON - "[]".

Быстрый обходной путьэто использование curlPerform () напрямую, а не postForm ()

r = dynCurlReader()
curlPerform(postfields = 'Archbishop Huxley', url = 'http://www.datasciencetoolkit.org/text2people', verbose = TRUE,
             post = 1L, writefunction = r$update)
r$value()

Это дает

[1]
"[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":0,\"end_index\":17,\"matched_string\":\"Archbishop
Huxley\"}]"

, и вы можете использовать fromJSON () для преобразования его в данные в R.

1 голос
/ 28 апреля 2011

Функция simplePostToHost в пакете httpRequest может сделать то, что вы ищете здесь.

1 голос
/ 28 апреля 2011

Я просто хотел указать, что должна быть проблема с передачей необработанной строки через функцию postForm.Например, если я использую curl из командной строки, я получаю следующее:

    $ curl -d "Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people
[{"gender":"u","first_name":"","title":"archbishop","surnames":"Huxley","start_index":0,"end_index":17,"matched_string":"Archbishop Huxley"}]

и в RI получаем

> api <- "http://www.datasciencetoolkit.org/text2people"
> postForm(api, a="Archbishop Huxley")
[1] "[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":44,\"end_index\":61,\"matched_string\":\"Archbishop Huxley\"},{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":88,\"end_index\":105,\"matched_string\":\"Archbishop Huxley\"}]"
attr(,"Content-Type")
                charset 
"text/html"     "utf-8" 

Обратите внимание, что он возвращает два элемента в строке JSON ини один из них не соответствует ни start_index, ни end_index.Это проблема с кодировкой или что-то?

...