【问题标题】:Difference between query and body in httr::POSThttr::POST 中查询和正文的区别
【发布时间】:2015-09-23 14:36:44
【问题描述】:

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

POST(url, body=list(p1="xyz",p2=1))

或

POST(url, query=list(p1="xyz",p2=1))

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

【问题讨论】:

  • 参数 p1 和 p2 的引号
  • 没关系,单人还是双人。

标签: r http post httr


【解决方案1】:

如果您刚开始使用 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 标头,因为它们在每种情况下都是相同的,并且与问题无关)

【讨论】:

    【解决方案2】:

    答案可能取决于服务器的预期。我认为在很多情况下,这无关紧要。但这取决于服务器。

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

    【讨论】:

    • 我认为许多服务器以相同方式解释它们的事实并不相关 - HTTP 请求完全不同
    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 2016-11-24
    • 2022-11-06
    • 2023-03-24
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多