如何将 GET 请求的 JSON 主体映射到参数?

How do I map the JSON body of a GET request to a parameter?

我的端点中有以下定义:

params do
    requires :entities do
      requires :id, type: String
      optional :email, type: String
      optional :phone, type: String
    end
  end
  post "test" do

  end

请注意,这仅适用于 POST 请求,以下 CURL 将有效:

curl -XPOST localhost/test 
     -H 'Content-Type: application/json' 
     -H 'Accept: application/json' 
     -d '{ "entities": [{ "id": 3, "email": "test@abc.com" }] }'

但是,当我将声明更改为获取 "test" 而不是 post 时,由于以下验证错误,带有 -XGET 的相应 curl 请求不再有效:

{"error":"entities is missing"}

如果我删除了参数要求,我可以在运行时手动检查参数散列并看到它只有一个键 "route_info"

我目前正在使用 Grape 0.7.0

发生这种情况是因为通过指定 -d 选项,您可以在请求正文中传递参数,而您的端点期望它们在路径中作为 url 的一部分。检查 here 为什么在 GET 请求中传递正文参数是个坏主意。

但是,可以使用该选项,但如果与 -G 结合使用。

-G, --get

When used, this option will make all data specified with -d, --data, --data-binary or --data-urlencode to be used in an HTTP GET request instead of the POST request that otherwise would be used. The data will be appended to the URL with a '?' separator.

这样您使用 -dget 请求将如下所示:

curl -XGET -G localhost/test 
     -H 'Content-Type: application/json' 
     -H 'Accept: application/json' 
     -d '{ "entities": [{ "id": 3, "email": "test@abc.com" }] }'