web-dev-qa-db-fra.com

Grails RestBuilder simple POST Exemple

J'essaie de publier des informations d'identification d'utilisateur OAuth2 sur un service OAuth2 à l'aide du plug-in Grails RestBuilder.

Si j'essaie de spécifier le corps du message en tant que carte, j'obtiens une erreur indiquant qu'aucun convertisseur de message ne concerne LinkedHashMap.

Si j'essaie de spécifier le corps en tant que chaîne, la publication est exécutée, mais aucune des variables n'est publiée sur l'action du serveur.

Voici le post:

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

J'ai également essayé de définir les variables url dans l'appel à la méthode post (), mais le nom d'utilisateur/mot de passe est toujours nul.

Ceci est un post très simple, mais je n'arrive pas à le faire fonctionner. Tout avis serait grandement apprécié.

14
Townsfolk

J'ai résolu le problème en utilisant une carte MultiValue pour le corps.

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
30
Townsfolk

Le code suivant fonctionne pour la connexion Box. Passez quelques heures à comprendre cela

    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
4
Mak Kul

J'ai découvert certains très facile à réaliser ce type d'action 

//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
1
jeet singh parmar