R:从RCurl包进行postForm并发出API调用

R:从RCurl包进行postForm并发出API调用,r,api,http,curl,rcurl,R,Api,Http,Curl,Rcurl,是否有人曾体验过来自RCurl软件包的postForm的限制 我正在从服务器上提取数据,几乎不知从何处收到了错误消息*HTTP 1.0,假设正文后关闭,然后是500内部服务器错误。我测试了配置,一切似乎都很好。我创建了一个干净的数据库,并在使用API/postForm从R调用的同时重新上传了20/30个案例的数据库。这一切工作,因为它应该,直到我得到大约150个案件,然后出现错误消息。无论上传的顺序如何,我上传的案例中出现的错误大约为150/160个案例,总文件大小大约为11到12MB。换句话说

是否有人曾体验过来自
RCurl
软件包的
postForm
的限制

我正在从服务器上提取数据,几乎不知从何处收到了错误消息
*HTTP 1.0,假设正文后关闭
,然后是
500内部服务器错误
。我测试了配置,一切似乎都很好。我创建了一个干净的数据库,并在使用API/
postForm
R
调用的同时重新上传了20/30个案例的数据库。这一切工作,因为它应该,直到我得到大约150个案件,然后出现错误消息。无论上传的顺序如何,我上传的案例中出现的错误大约为150/160个案例,总文件大小大约为11到12MB。换句话说,错误似乎并不取决于具体的情况,因为打破错误的情况并不相同

如有任何建议,将不胜感激

我附上了一个截图来给这篇相当无聊的文章增添趣味,并弥补没有一个有效的例子

更新2013-08-2419:33:18Z 这里是我的
curlVersion()$version
sessionInfo()
信息

> curlVersion()$version
[1] "7.22.0"
> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: i686-pc-linux-gnu (32-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RCurl_1.95-4.1 bitops_1.0-6
更新2013-08-2605:39:26Z 正如中所建议的,我已经添加了有效调用和失败调用的verbose
RCurl
输出,请参见下文

数据库中少于150个案例的调用
>R.object.API POST/API/HTTP/1.1
主持人:research.org
接受:*/*
内容长度:573
预期:100人继续
内容类型:多部分/表单数据;边界=------------------------------------XXXXXXXXXX
 
调用失败,数据库中有超过150个案例
>R.object.API POST/API/HTTP/1.1
主持人:research.org
接受:*/*
内容长度:573
预期:100人继续
内容类型:多部分/表单数据;边界=------------------------------------XXXXXXXXXX
不回答您的问题,但与选项相关,请保持:

RCurl
使用
libcurl
库。这与
CURL
命令行工具不同。您需要查看
libcurl
选项
CURLOPT\u TCP\u KEEPALIVE
也许是你想要的。在
RCurl
中,如果它出现在
listcollpoptions()
中,它将被列为
tcp.keepalive

从easyopt手册页中,这是在7.25.0中添加的。您可以通过运行

> curlVersion()$version
[1] "7.22.0"

不幸的是,
libcurl
RCurl
正在使用的版本还不能处理保持有效性。

将此作为一个答案,因为它更容易格式化。我的建议是将以下内容保存在一个文件中,填写表单地址(即更改
您试图在哪里将数据发布到适当的地址),将其命名为
test.html
,然后在浏览器中打开

我已经根据您上面的示例填写了大多数值,但我不知道令牌字段中应该包含什么-这取决于您的具体问题

<!DOCTYPE html>
<html>
<head></head>
<body>   
<div class="content">
    <form action="WHEREVER_YOU_ARE_TRYING_TO_POST_DATA" method="post">
        token: <input name="token" type="text" size="100" /><br />
        content: <input name="content" type="text" size="100" value="record" /><br />
        type: <input name="type" type="text" size="100" value="flat"/><br />
        format: <input name="format" type="text" size="100" value="csv"/><br />
        rawOrLabel: <input name="rawOrLabel" type="text" size="100" value="Label"/><br />
        <input name="Submit" type="submit" value="submit" />
    </form>
</div>
</body>
</html>

令牌:
内容:
类型:
格式:
rawOrLabel:

如果提交此表单有效,但您的
postForm
代码无效,那么您的R代码会出现一些奇怪的情况。如果它们都失败了,那么您就遇到了一个更深层次的问题,可能与R无关。

您是否尝试过为curl的--keepalive time参数传递一个值?谢谢您回答我的问题!不,我还没试过。回到工作站后,我将阅读文档,并尝试向Rcurl的“keepalive time参数”传递一个值。@scottyaz,我使用的是
Rurl
version
1.95-4.1
,我使用
listcollOptions()
查找了
Rcurl
包可以理解的选项名称,但是,
--keepalive time
不是列出的174个选项中的一个
keepalive time
在中提到,但在
listcolloptions()
中没有提到。您(或其他任何人)是否可以在
中提供一个选项,说明如何在
中使用a使连接保持打开时间超过默认的60秒。opts=curlpoptions(…)
?我怀疑更改keepalive参数会影响这种情况-即使连接没有保持活动状态,它也应该自动重新连接。我怀疑您发送数据的方式服务器不理解,或者您有其他服务器问题。@hadley,谢谢您的评论。对于如何开始识别错误,您有什么建议吗?在所讨论的调用中,我只是获取服务器的数据,而不是发送实际日期(假设我使用的术语正确)。谢谢。仅供参考,Rcurl使用system curl,因此版本将取决于您安装的版本。感谢您扩展您的评论。不幸的是,你的帖子对我不起作用,因为我还必须提交服务器证书,或者我可能做错了什么?
> curlVersion()$version
[1] "7.22.0"
<!DOCTYPE html>
<html>
<head></head>
<body>   
<div class="content">
    <form action="WHEREVER_YOU_ARE_TRYING_TO_POST_DATA" method="post">
        token: <input name="token" type="text" size="100" /><br />
        content: <input name="content" type="text" size="100" value="record" /><br />
        type: <input name="type" type="text" size="100" value="flat"/><br />
        format: <input name="format" type="text" size="100" value="csv"/><br />
        rawOrLabel: <input name="rawOrLabel" type="text" size="100" value="Label"/><br />
        <input name="Submit" type="submit" value="submit" />
    </form>
</div>
</body>
</html>