Rest服务没有看到Grails Rest Client Builder中的参数

时间:2014-03-14 21:03:46

标签: rest grails

所以我有一个简单的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版。

params看起来像

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

休息服务方法看起来像......

@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服务识别表单参数。

2 个答案:

答案 0 :(得分:4)

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")

答案 1 :(得分:2)

要在请求正文中干净地传递值,请使用MultiValueMap和(未记录的,从我看到的)&#39; body()&#39;根据这个答案的方法。 https://stackoverflow.com/a/21744515/17123