【问题标题】:R httr package - Make POST request to an API with bodyR httr 包 - 向带有正文的 API 发出 POST 请求
【发布时间】:2020-10-14 00:02:06
【问题描述】:

我尝试向我的 API 发出发布请求。在 Postman 中是这样的:

发布: http://localhost:5000/api/login
身体: {"secret": "bla"}

这给了我一个可以正常工作的访问令牌。我对httr packge 进行了同样的尝试,如下所示:

login <- list(
  secret = "bla"
)

httr::POST("http://localhost:5000/api/login", body = login, verbose(), content_type("application/json"))

这是详细输出,我不知道为什么会返回 400 错误。

-> POST /api/login HTTP/1.1
-> Host: localhost:5000
-> User-Agent: libcurl/7.64.1 r-curl/4.3 httr/1.4.1
-> Accept-Encoding: deflate, gzip
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Length: 145
-> Content-Type: application/json; boundary=------------------------a4dc23f1d3e7221e
-> 
>> --------------------------a4dc23f1d3e7221e
>> Content-Disposition: attachment; name="secret"
>> 
>> bla
>> --------------------------a4dc23f1d3e7221e--

<- HTTP/1.0 400 BAD REQUEST
<- Content-Type: application/json
<- Content-Length: 91
<- Access-Control-Allow-Origin: *
<- Server: Werkzeug/1.0.0 Python/3.7.6
<- Date: Tue, 13 Oct 2020 15:14:54 GMT

我做错了什么?

【问题讨论】:

    标签: r postman httr


    【解决方案1】:

    尽量确保正文是 json 字符向量而不是 r 列表。

    httr::POST("http://localhost:5000/api/login", body = jsonlite::toJSON(login), verbose(), content_type("application/json"))
    

    【讨论】:

    • 太好了,谢谢!通过 httr 在后台执行此操作 :-)
    • 没问题。它做一些事情,但不是其他事情。很难跟踪。
    • 其实我觉得加encode = "json"参数就够了,然后就不用手动转换body了
    • 可能是真的。我没试过。但这将是一个很好的便利。
    • 这个答案拯救了我的一天。在我的应用程序中,模型的一个输入特征是可变长度向量,它基于可能是多项选择的用户输入。如果没有 jsonlite::toJSON() 修饰,当用户选择单个选项时,嵌套列表将由 httr::POST() 转换为 {'data':{'feat_1':'a'}},即API 无法识别,经过修饰后,有效负载将为 {'data':{'feat_1':['a'])。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多