如果您刚开始使用 httr 和 API,我强烈建议您了解 HTTP 请求的结构。一种方法是凭经验,使用http://httpbin.org 和verbose():
library(httr)
args <- list(p1 = "xyz", p2 = 1)
POST("http://httpbin.org/post", query = args, verbose())
#-> POST /post?p1=xyz&p2=1 HTTP/1.1
#-> Host: httpbin.org
#-> Content-Length: 0
POST("http://httpbin.org/post", body = args, verbose())
#-> POST /post HTTP/1.1
#-> Host: httpbin.org
#-> Content-Length: 232
#-> Expect: 100-continue
#-> Content-Type: multipart/form-data; boundary=---03a3f580d7af2b29
#->
#>> ---03a3f580d7af2b29
#>> Content-Disposition: form-data; name="p1"
#>>
#>> xyz
#>> ---03a3f580d7af2b29
#>> Content-Disposition: form-data; name="p2"
#>>
#>> 1
#>> ---03a3f580d7af2b29--
您会注意到发送数据的方式完全不同。使用query,数据编码在url的查询部分,使用body,它在HTTP请求的正文中发送。
encode 参数的不同值以不同的方式发送数据:
POST("http://httpbin.org/post", body = args, verbose(), encode = "form")
#-> POST /post HTTP/1.1
#-> Host: httpbin.org
#-> Content-Type: application/x-www-form-urlencoded
#-> Content-Length: 11
#->
#>> p1=xyz&p2=1
POST("http://httpbin.org/post", body = args, verbose(), encode = "json")
#-> POST /post HTTP/1.1
#-> Host: httpbin.org
#-> Content-Type: application/json
#-> Content-Length: 19
#->
#>> {"p1":"xyz","p2":1}
(我从每个示例中删除了 User-Agent、Accept-Encoding 和 Accept 标头,因为它们在每种情况下都是相同的,并且与问题无关)