Пример простого примера POST-теста Grails RestBuilder

Я пытаюсь сделать учетную запись пользователя OAuth2 для службы OAuth2 с помощью плагина Grails RestBuilder.

Если я попытаюсь указать тело сообщения как карту, я получаю сообщение об ошибке для каких-либо преобразователей сообщений для LinkedHashMap.

Если я попытаюсь указать тело как String, сообщение будет проходить, но ни одна из переменных не будет отправлена на действие сервера.

Вот сообщение:

RestBuilder rest = new RestBuilder()
def resp = rest.post("http://${hostname}/oauth/token") {
    auth(clientId, clientSecret)
    accept("application/json")
    contentType("application/x-www-form-urlencoded")

    // This results in a message converter error because it doesn't know how
    // to convert a LinkedHashmap
    // ["grant_type": "password", "username": username, "password": password]

    // This sends the request, but username and password are null on the host
    body = ("grant_type=password&username=${username}&password=${password}" as String)
}
def json = resp.json

Я также попытался установить urlVariables в вызове метода post(), но имя пользователя/пароль по-прежнему равно нулю.

Это очень простой пост, но я не могу заставить его работать. Любые советы будут очень признательны.

Ответ 1

Я решил проблему, используя карту MultiValue для тела.

RestBuilder rest = new RestBuilder()
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>()
form.add("grant_type", "password")
form.add("username", username)
form.add("password", password)
def resp = rest.post("http://${hostname}/oauth/token") {
    auth(clientId, clientSecret)
    accept("application/json")
    contentType("application/x-www-form-urlencoded")
    body(form)
}
def json = resp.json

Ответ 2

Следующий код работает для подключения Box. Проведите несколько часов, выяснив это

    String pclient_id = grailsApplication.config.ellucian.box.CLIENT_ID.toString()
    String pclient_secret=grailsApplication.config.ellucian.box.CLIENT_SECRET.toString()
    String pcode = params.code

    log.debug("Retrieving the Box Token using following keys Client ID: ==>"+pclient_id+"<== Secret: ==>"+pclient_secret+"<== Code: ==>"+pcode)
    RestBuilder rest = new RestBuilder()

    MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>()
    form.add("client_id", pclient_id)
    form.add("client_secret", pclient_secret)
    form.add("grant_type", "authorization_code")
    form.add("code", pcode)
    def resp = rest.post("https://app.box.com/api/oauth2/token") {
        accept("application/json")
        contentType("application/x-www-form-urlencoded")
        body(form)
    }

    def js = resp.json.toString()
    println("sss"+js)
    def slurper = new JsonSlurper()
    def result = slurper.parseText(js)
    println("Message:"+result.error)

    render js

Ответ 3

Я обнаружил, что очень легко выполнить такой тип действия

//Get
 public static RestResponse getService(String url) {
  RestResponse rResponse = new RestBuilder(proxy:["localhost":8080]).get(Constants.URL+"methodName")
  return rResponse
 }

 //POST : Send complete request as a JSONObject
 public static RestResponse postService(String url,def jsonObj) {
   RestResponse rResponse = new RestBuilder(proxy:["localhost":8080]).post(url) {
   contentType "application/json"
   json {  jsonRequest = jsonObj  }
  }
  return rResponse
 }

Method 1 :

def resp = RestUtils.getService(Constants.URL+"methodName")?.json
render resp as JSON

Method 2 :

JSONObject jsonObject = new JSONObject()
jsonObject.put("params1", params.paramOne)
jsonObject.put("params2", params.paramTwo)
def resp = RestUtils.postService(Constants.URL+"methodName", jsonObject)?.json
render resp as JSON