Как использовать RCurl или RMongo через HTTP с аутентификацией и самоподписанным SSL для чтения данных JSON

Я использую R для написания программы и выполнения некоторых анализов. Данные собираются внешним поставщиком с помощью MongoDB в формате JSON. Они предоставляют его мне через URI на порту 443, который они хотят, чтобы я запрашивал, используя cURL. У них есть аутентификация и самоподписанный SSL.

Я могу аутентифицировать и сбрасывать данные через curl в Windows, однако для создания долгосрочного устойчивого решения все это нужно делать в R.

Поставщик говорит, что RCurl «должен» работать, но они не предоставляют никакой поддержки, и им в основном просто не нравится идея использования RMongo, и они не комментируют ее (но если бы мы могли заставить ее работать, это было бы здорово, в мое мнение).

У меня загружены следующие пакеты — ggplot2 — DBI — rjson — RJSONIO (иногда я не загружаю этот, если использую rjson, или наоборот) — RMongo — rstudio — RCurl

Самоподписанный сертификат вызывал проблемы даже с curl, но они были решены путем редактирования настроек в Ruby, а затем запуска командной оболочки с Ruby и использования curl таким образом. Я не уверен, связаны ли проблемы в R.

При попытке пройти маршрут RCurl я получаю такие команды/ошибки:

  x <- getURL("https://xxx.xx.xxx.xxx:443/db/_authenticate", userpwd="xxxx:xxxxx") }{Error in function (type, msg, asError = TRUE)  : couldn't connect to host

и при попытке использовать RMongo я еще более невежествен...

> mongo <- mongoDbConnect("xxx.xx.xxx.xxx")

имя пользователя = «xxxx» пароль = «хххххххххххх» аутентифицировано ‹- dbAuthenticate (монго, имя пользователя, пароль) 25 февраля 2013 г. 16:00:09 com.mongodb.DBTCPConnector fetchMaxBsonObjectSize ПРЕДУПРЕЖДЕНИЕ: Исключение, определяющее размер maxBSON с использованием0 java.io.IOException: не удалось подключиться к [/127.0.0.1:27017] bc:java.net.ConnectException: в соединении отказано: подключитесь к com.mongodb.DBPort.open(DBPort.java:224) к com.mongodb.DBPort. go(DBPort.java:101) в com.mongodb.DBPort.go(DBPort.java:82) в com.mongodb.DBPort.findOne(DBPort.java:142) в com.mongodb.DBPort.runCommand(DBPort.java :151) в com.mongodb.DBTCPConnector.fetchMaxBsonObjectSize(DBTCPConnector.java:429) в com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:416) в com.mongodb.DBTCPConnector.call(DBTCPConnector.java:193) в com .mongodb.DBApiLayer$MyCollection._find(DBApiLayer.java:303) в com.mongodb.DB.command(DB.java:159) в com.mongodb.DB.command(DB.java:14) 4) в com.mongodb.DB._doauth(DB.java:503) в com.mongodb.DB.authenticate(DB.java:440) в rmongo.RMongo.dbAuthenticate(RMongo.scala:24)

Error in .jcall(rmongo.object@javaMongo, "Z", "dbAuthenticate", username,  : 
com.mongodb.MongoException$Network: can't call something
Feb 25, 2013 4:00:10 PM com.mongodb.DBPortPool gotError
WARNING: emptying DBPortPool to 127.0.0.1:27017 b/c of error
java.io.IOException: couldn't connect to [/127.0.0.1:27017]     bc:java.net.ConnectException: Connection refused: connect
at com.mongodb.DBPort._open(DBPort.java:224)
at com.mongodb.DBPort.go(DBPort.java:101)
at com.mongodb.DBPort.go(DBPort.java:82)
at com.mongodb.DBPort.call(DBPort.java:72)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:202)
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:303)
at com.mongodb.DB.command(DB.java:159)
at com.mongodb.DB.command(DB.java:144)
at com.mongodb.DB._doauth(DB.java:503)
at com.mongodb.DB.authenticate(DB.java:440)
at rmongo.RMongo.dbAuthenticate(RMongo.scala:24)

любая помощь будет принята с благодарностью!


person Jason    schedule 26.02.2013    source источник
comment
Ваш заголовок в лучшем случае вводит в заблуждение. Вы используете не http:, а https:   -  person IRTFM    schedule 26.02.2013


Ответы (1)


В прошлом у меня была проблема с RCurl, когда мне нужно было явно указать на сертификаты безопасности, чтобы он работал нормально. В итоге мне понадобилось что-то вроде этого:

out <- postForm("https://url.org/api/",
                 token="IMATOKEN",
                 .opts=curlOptions(cainfo="C:/path/aaa.crt"))

Я вручную экспортировал сертификат, необходимый для работы.

Кроме того, похоже, что вы должны выполнять запрос POST с учетом этого URI, а не GET. Попробуйте команду postForm(), может быть?

ОТРЕДАКТИРОВАНО ДОБАВИТЬ:

Ладно, я думаю, все станет немного яснее, если мы отойдем на секунду назад. Ваша цель — получить файл с определенного URL-адреса (в основном, с помощью wget, но из R)? Или ваша цель отправить форму, которая впоследствии вернет нужные вам данные?

ЕСЛИ вы просто пытаетесь получить что-то, что стоит за базовой (а также довольно НЕЗАЩИЩЕННОЙ) HTTP-аутентификацией, вам следует сделать две вещи:

  • Попросите поставщика данных использовать более безопасный вариант.
  • Используйте опцию getURL(), как показано (используя пример www.omegahat.org, о котором вы писали):

Код:

getURL("http://www.omegahat.org/RCurl/testPassword/",.opts=list(userpwd="bob:welcome"))
OR
getURL("http://bob:[email protected]/RCurl/testPassword/")

Теперь, если вам нужно отправить форму для получения данных, вы обычно передаете токены аутентификации и т. д. в качестве параметров (так, в приведенном выше примере `token='.

person TARehman    schedule 26.02.2013
comment
Спасибо TARehman, сейчас попробую ваши решения. Как относительный нуб, это может занять у меня немного времени, но я отпишусь сегодня утром! - person Jason; 26.02.2013
comment
Куда идут номера пользователя/пароля и порта? - person Jason; 26.02.2013
comment
Хм, хорошо, я попытался запустить этот пример вашей команды, который я нашел в Интернете, и он также возвращает мне ошибку. Означает ли это, что у меня может быть проблема с корпоративным брандмауэром? Я могу нормально загружать пакеты в RStudio, поэтому я подумал, что проблема не в брандмауэре... #postForm("http://www.omegahat.org/RCurl/testPassword/form_validation.cgi", your_name = "Duncan", your_age = "35-55", your_sex = "m", submit = "submit", .opts = list(userpwd = "bob:welcome")) Error in function (type, msg, asError = TRUE) : couldn't connect to host - person Jason; 26.02.2013
comment
Я попробовал вашу команду и получил ошибку авторизации, а не сбой подключения к хосту. - person TARehman; 26.02.2013
comment
Хорошо, проблема здесь (ну, может быть несколько), которую я вижу, заключается в том, что я не уверен в характере API, который вы используете для получения своих данных. Я отредактирую свой ответ, чтобы отразить то, что мне интересно. - person TARehman; 26.02.2013
comment
Спасибо за обновление. Итак, это httpS (извините за любую опечатку, связанную с этим с моей стороны), и это MongoDB RESTful api (они называют это своим HTTP API на веб-сайте, но в данном случае это httpS). Он не дал мне сертификат или токен, о котором я знаю (может быть, он был как-то автоматически загружен?). Моя цель - просто получить некоторые данные JSON, которые есть. Итак, что я хочу сделать, это эквивалент curl -k --data user/pass info xxx.xx.xxx.xx/db/test/_athenticate, за которым следует curl -k xxx.xx.xxx.xx/db/test/_find - person Jason; 26.02.2013
comment
Я попробовал примеры getURL с учетными данными примера, а также с моей собственной реальной информацией, но без удовольствия. Все еще ошибка в функции (тип, msg, asError = TRUE): не удалось подключиться к хосту - person Jason; 27.02.2013
comment
Поскольку вы попробовали это и получили другую ошибку, я собираюсь связаться с еще несколькими людьми по поводу возможного аспекта брандмауэра. - person Jason; 27.02.2013
comment
Обновление: я на 99% уверен, что вы ответили на вопрос, и мне просто нужно решить эту проблему. Пройдет около 24 часов, прежде чем мой ИТ-гуру сможет рассмотреть проблему с прокси. Я новичок в StockOverflow, кроме как в качестве пиявки, но я попытаюсь отдать вам должное за ваш полезный ответ, если он позволит мне (сначала мне может понадобиться больше представителей или что-то в этом роде, я знаю, как это работает). Спасибо еще раз! - person Jason; 27.02.2013
comment
@Jason Нет проблем, дайте мне знать, как это работает, и вы всегда можете принять ответ независимо от вашего представителя (поскольку вы задали вопрос). Во всяком случае, я надеюсь, что это работает! - person TARehman; 27.02.2013