使用 R 调用 Web 服务:发送数据并在 R 中返回结果 table

Using R to call a Web Service: Send data and get the result table back in R

http://snomedct.t3as.org/ 这是一个 Web 服务,将分析英语临床文本,并报告可以检测到的任何概念。
例如-我头痛。它将头痛识别为症状。

现在我想做的是通过 R 将句子发送到 Web 服务,并将 table 从网页返回到 R 以供进一步分析。

如果我们以他们为例curl command-line:

curl -s --request POST \
        -H "Content-Type: application/x-www-form-urlencoded" \
        --data-urlencode "The patient had a stroke." \
        http://snomedct.t3as.org/snomed-coder-web/rest/v1.0/snomedctCodes

可以很容易地翻译成 httr

-s 的意思是 "silent"(没有进度条或错误消息)所以我们真的不需要翻译它。

Any -H 表示在请求中添加一个header。这个特殊的 Content-Type header 可以用 encode 参数更好地处理 httr::POST.

--data-urlencode 参数表示 URL 对该字符串进行编码并将其放入请求的 body

最后,URL是要调用的资源。

library(httr)

result <- POST("http://snomedct.t3as.org/snomed-coder-web/rest/v1.0/snomedctCodes", 
               body="The patient had a stroke.",
               encode="form")

由于您不经常这样做,您可以用 with_verbose() 包装 POST 调用以查看发生了什么(在 httr 文档中查找)。

在此之后技术上应该做很多细微差别(比如使用 stop_for_status()warn_for_status() 甚至只是 status_code() 检查 HTTP 状态代码,但为了简单起见,让我们假设调用有效(这是他们的示例,所以它确实有效并且 return 是一个 200 HTTP 状态代码,这是一件好事)。

默认情况下,该 Web 服务是 returning JSON,因此我们需要将其转换为 R object。当 httr 做 built-in 解析时,我喜欢使用 jsonlite 包来处理结果:

dat <- jsonlite::fromJSON(content(result, as="text"),  flatten=TRUE)

fromJSON 函数采用一些参数,旨在帮助将 JSON 塑造成合理的 R 数据结构(许多 APIs return 可怕 JSON and/or XML)。此 API 属于 "horrible" 类别。 dat 中的数据非常粗糙,进一步解码将是一个单独的 SO 问题。