REST服务不是从Grails的REST客户端生成器看到参数(Rest Service not se

2019-10-19 13:37发布

所以我有一个简单的Grails UI,这需要几个字段..名字,姓氏等的形式。 该控制器调用,然后使用REST客户端Builder插件调用REST服务的服务方法。

其余服务不承认但是参数。

下面是一个简单的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]

REST服务方法看起来像...

@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
    }
 }

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

当我从邮递员提交后它工作正常。 从邮差成功的请求看起来像

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

Answer 1:

REST客户端应使用请求主体要发布:

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

请参阅文档的详细信息。

更新:

由于生产商期待请求参数一样大的查询字符串,而不是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")



Answer 2:

干净传入请求主体的价值观,用MultiValueMap和(无证,从我所看到的)的身体()方法按这个答案。 https://stackoverflow.com/a/21744515/17123



文章来源: Rest Service not seeing parameters from Grails Rest Client Builder
标签: rest grails