这个卷曲请求的R等价物是什么

时间:2015-09-23 12:00:59

标签: r curl rcurl httr

我在curl中有这样的请求

curl -H "Content-Type:application/json"             \
     -X GET 127.0.0.1:8084/clusterpredict/byheaders \
     -v                                             \
     -b "text1"                                     \
     -A "text2"

如何在R中的RCurlhttr库中执行相同的操作?

2 个答案:

答案 0 :(得分:5)

httr

  • -A / --user-agent转换为user_agent()
  • -b / --cookie会转换为set_cookies(),但您需要读取Cookie文件并将其设置为对其进行调用(RCurl具有结构读取存储的cookie文件)。我之所以做出这样的假设,是因为您在"COOKIE1=1; COOKIE2=b"之后没有使用-b格式。您也可以在set_cookies()中单独设置
  • -H / --header转换为add_headers(),但设置内容类型有特殊功能(见下文)
  • -v / --verbose转换为verbose()
  • -X / --request转换为实际的VERB函数(在本例中为GET()

以下是将Cookie读入文件以便在set_cookie()中使用的一种方法(如果您确实使用了Cookie jar):

ctmp <- read.table("cookies.txt", sep="\t", header=FALSE, stringsAsFactors=FALSE)[,6:7]
crumbs <- setNames(as.character(as.character(ctmp$V6)), ctmp$V7)

因此,您的示例将转换为httr

GET("http://127.0.0.1:8084/clusterpredict/byheaders", 
    content_type_json(),
    user_agent("text2"),
    set_cookies(.cookies=crumbs),
    verbose())

如果你有个人饼干而不是饼干罐:

GET("http://127.0.0.1:8084/clusterpredict/byheaders", 
    content_type_json(),
    user_agent("text2"),
    set_cookies(COOKIE1="value1", COOKIE2="value2),
    verbose())

请注意httr将在同一R会话中对同一域的调用之间保留cookie,因此无需在后续调用中继续指定该文件或那些显式cookie值。

您可以将输出值分配给变量,然后从中检索内容:

response <- GET("http://127.0.0.1:8084/clusterpredict/byheaders", 
    content_type_json(),
    user_agent("text2"),
    set_cookies(COOKIE1="value1", COOKIE2="value2),
    verbose())

result <- content(response)
print(str(result))

通常,可以使用jsonlite包或xml2包(取决于结果类型)进行解析而不依赖于内置的httr解析,因为您可以控制输出更好。在这种情况下,它是JSON,所以:

library(jsonlite)
result <- fromJSON(content(response, as="text"))
print(str(result))

答案 1 :(得分:1)

如果没有实时地址,这很难测试,但这里有一些内容可以帮助您开始使用httr

library(httr)

#curl    -H "Content-Type:application/json"      -X GET  127.0.0.1:8084/clusterpredict/byheaders    -v -b "text1" -A "text2"
GET(
  "127.0.0.1:8084/clusterpredict/byheaders",
  add_headers(
    "Content-Type" = "application/json"
  ),
  set_cookies("text1"),
  user_agent("text2"),
  verbose() #-v
)