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

What would be the R equivalent for this curl request

我在 curl 有这样的请求

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

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

httr中:

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

这是一种将 cookie 读入文件以供 set_cookie() 使用的方法(如果您确实在使用 cookie 罐):

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 包(取决于结果类型)进行解析 vs 依赖内置的 httr 解析,因为你可以更好地控制输出。在这种情况下,它是 JSON,所以:

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

没有实时地址,这很难测试,但可以让您开始使用 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
)