httr :: POST中查询和正文之间的区别

Kan*_*hal 4 post r http httr

我想在url中传递几个post参数,比如两个参数p1和p2.p1和p2的值是xyz(字符串)和1(数字).以下命令有什么区别:

POST(url, body=list(p1="xyz",p2=1))
Run Code Online (Sandbox Code Playgroud)

要么

POST(url, query=list(p1="xyz",p2=1))
Run Code Online (Sandbox Code Playgroud)

我也无法理解是否应该使用参数p1和p2的引用.如果是,那么单,双.

had*_*ley 5

如果您开始使用httr和API,我强烈建议您了解HTTP请求的结构.一种方法是凭经验,使用http://httpbin.orgverbose():

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--
Run Code Online (Sandbox Code Playgroud)

您会注意到数据发送的方式完全不同.随着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}
Run Code Online (Sandbox Code Playgroud)

(我删除了User-Agent,Accept-Encoding并且Accept从每个例如标题,因为他们是在每种情况下是相同的,而不是密切相关的问题)


Tho*_*mas 1

答案可能取决于服务器的期望。我认为在很多情况下,这并不重要;但这取决于服务器。

第二个(查询)版本就像调用:一样POST(paste0(url, "?p1=xyz&p2=1")),而第一个(主体)版本将参数作为 HTTP 请求主体中的键值对传递。