0

我正在使用 R 编写程序并执行一些分析。数据由外部供应商使用 MongoDB 以 JSON 格式捕获。他们通过端口 443 上的 URI 向我提供它,他们希望我使用 cURL 进行查询。他们有适当的身份验证和自签名 SSL。

我可以在 Windows 中通过 curl 进行身份验证和转储数据,但是要创建一个长期可持续的解决方案,这一切都需要在 R 中完成。

供应商说 RCurl“应该”工作,但他们没有提供任何支持,他们基本上只是不喜欢使用 RMongo 的想法并且没有对此发表评论(但如果我们能让它工作,那就太棒了,在我的意见)。

我加载了以下包 - ggplot2 - DBI - rjson - RJSONIO(如果我使用 rjson,有时我不会加载这个包,反之亦然) - RMongo - rstudio - RCurl

即使使用 curl,自签名证书也会导致问题,但通过在 Ruby 中编辑设置,然后使用 Ruby 启动 cmd shell 并以这种方式使用 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, username, password) 2013 年 2 月 25 日下午 4:00:09 com.mongodb.DBTCPConnector fetchMaxBsonObjectSize 警告:使用 0 java.io.IOException 确定 maxBSON 大小的异常:无法连接到 [/127.0.0.1:27017] bc:java.net.ConnectException:连接被拒绝:在 com.mongodb.DBPort 处连接。在 com.mongodb.DBPort.go(DBPort.java:101) 在 com.mongodb.DBPort.go(DBPort.java:82) 在 com.mongodb.DBPort.findOne(DBPort.java) 打开(DBPort.java:224) :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: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)

任何帮助将不胜感激!

4

1 回答 1

0

过去我在使用 RCurl 时遇到过问题,我需要明确地将其指向安全证书以使其正常工作。我最终需要这样的东西:

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

我已经手动导出了我需要让它工作的证书。

此外,看起来你应该在给定 URI 的情况下执行 POST 请求,而不是 GET。试试这个postForm()命令,也许?

编辑添加:

好的,我想如果我们退后一步,事情可能会更清楚一点。您的目标是从特定的 URL 获取一些文件(基本上是从 R 中执行 wget)?或者您的目标是提交随后返回所需数据的表单?

如果您只是想获得基本(而且相当不安全)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='.

于 2013-02-26T15:02:01.250 回答