【问题标题】:Rest Service not seeing parameters from Grails Rest Client BuilderRest Service 没有看到来自 Grails Rest Client Builder 的参数
【发布时间】:2014-03-14 21:03:46
【问题描述】:

所以我有一个简单的 Grails UI,它在一个表单中包含几个字段 .. firstName、lastName 等。控制器调用服务方法,然后使用 Rest Client Builder 插件调用 REST 服务。

但是其余服务无法识别参数。

这是简单的休息调用。

    def resp = rest.post(baseUrl, params)
            {
                header 'Accept', 'application/json'
                contentType "application/x-www-form-urlencoded"
            }

使用 2.0.1 版插件。

参数看起来像

[firstName:Kas, action:index, format:null, controller:myController, max:10]

Rest Service 方法看起来像 ...

@POST
@Path("/employees")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
public IdmResult createNewEmployee(@FormParam("firstName") String firstName) {
    try {
        if(firstName == null) return constructFailedIdmResult("First Name is a required field");

        // Do some other stuff
    }
 }

服务响应“名字是必填字段”

当我从 Postman 提交帖子时,它工作正常。邮递员的成功请求看起来像

POST /idm/employees HTTP/1.1
Host: <ip>:<url>
Accept: application/json 
firstName: Kas
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

想知道如何查看插件正在构建的请求,以便比较差异,但最终我只需要知道如何从插件正确发送请求,以便 Rest Service 识别表单参数。

【问题讨论】:

    标签: rest grails


    【解决方案1】:

    Rest 客户端应该使用请求正文来 POST:

    def resp = rest.post(baseUrl) {
        header 'Accept', 'application/json'
        contentType "application/x-www-form-urlencoded"
        json {
            firstName = "Kas"
        }
    }
    

    或者简单地说,

    def resp = rest.post(baseUrl) {
        header 'Accept', 'application/json'
        contentType "application/x-www-form-urlencoded"
        json firstName: "Kas"
    }
    

    详情请参阅docs

    更新:

    由于生产者期望请求参数是大查询字符串而不是 JSON,因此您最终可能会这样做:

    def queryString = params.collect { k, v -> "$k=$v" }.join(/&/)
    
    def resp = rest.post("$baseUrl?$queryString") {
        header 'Accept', 'application/json'
        contentType "application/x-www-form-urlencoded"
    }
    

    或者只是def resp = rest.post("$baseUrl?$queryString")

    【讨论】:

    • 有没有办法在不单独指定每个参数的情况下干净地传递请求正文中的 params 对象?
    • 您可以使用json params。但是你为什么要传递对生产者来说不必要的请求元素。比如actioncontroller。它们与生产者无关。
    • 该表单除了名字之外还有更多可能的字段。更新表单将有超过 20 个可能的字段可以更新......如果每次更改表单字段时都不需要重新编码服务调用,它会更清晰。
    • 好吧,在这种情况下,我会从 params 映射到新地图,或者只是删除那些不需要的 &lt;k,v&gt; 并将其发送过来。无论如何,使用json params 有效吗?
    • 第一次尝试给出了同样的错误......我想看看实际的请求......我认为应该让问题显而易见......
    【解决方案2】:

    要在请求正文中干净地传递值,请根据此答案使用 MultiValueMap 和(未记录,据我所知)“body()”方法。 https://stackoverflow.com/a/21744515/17123

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2014-01-25
      • 1970-01-01
      • 2015-05-31
      相关资源
      最近更新 更多