Как использовать 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, а затем запуска оболочки cmd с 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")
username = "xxxx" password = "xxxxxxxxxxxxx" аутентифицировано<- dbAuthenticate (mongo, имя пользователя, пароль) 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. открыть (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:4).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:144) на 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)
любая помощь будет принята с благодарностью!
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:welcome@www.omegahat.org/RCurl/testPassword/")
Теперь, если вам нужно отправить форму для получения данных, вы, как правило, передаете токены аутентификации и т. Д. В качестве параметров (поэтому в приведенном выше примере `token='.