web-dev-qa-db-fra.com

Passer plusieurs paramètres pour reposer l'API - Spring

J'essaie de savoir s'il est possible de transmettre un objet JSON à une API, ou de lui transmettre plusieurs paramètres. Et comment lire ces paramètres au printemps? Supposons que l'URL ressemble aux exemples ci-dessous: 

Ex.1 http://localhost:8080/api/v1/mno/objectKey?id=1&name=saif

Est-il valide de passer un objet JSON comme dans l'URL ci-dessous?

Ex.2 http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}

Des questions:

1) Est-il possible de passer un objet JSON à l’URL comme dans Ex.2?

2) Comment pouvons-nous passer et analyser les paramètres dans Ex.1? 

J'ai essayé d'écrire des méthodes pour atteindre mon objectif, mais n'ai pas trouvé la bonne solution?

J'ai essayé de transmettre l'objet JSON en tant que @RequestParam

http://localhost:8080/api/v1/mno/objectKey?id=1 Il y a eu une erreur inattendue (type=Unsupported Media Type, status=415). Content type 'null' not supported

http://localhost:8080/api/v1/mno/objectKey/id=1 Il y a eu une erreur inattendue (type=Not Found, status=404). No message available

http://localhost:8080/api/v1/mno/objectKey/%7B%22id%22:1%7D Il y a eu une erreur inattendue (type=Not Found, status=404). No message available

@RequestMapping(value="mno/{objectKey}",
                method = RequestMethod.GET, 
                consumes="application/json")
    public List<Book> getBook4(@RequestParam ObjectKey objectKey) {
        ...
    }

J'ai essayé de transmettre l'objet JSON en tant que @PathVariable

@RequestMapping(value="ghi/{objectKey}",method = RequestMethod.GET)
    public List<Book> getBook2(@PathVariable ObjectKey objectKey) {
        ...         
    }

J'ai créé cet objet pour contenir le paramètre id et d'autres paramètres tels que name, etc .... 

class ObjectKey{
        long id;
        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
    }
14
Saif Masadeh

(1) Est-il possible de passer un objet JSON à l'URL comme dans Ex.2?

Non, car http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"} n'est pas une URL valide.

Si vous voulez le faire de manière RESTful, utilisez http://localhost:8080/api/v1/mno/objectKey/1/Saif et définissez votre méthode comme suit:

@RequestMapping(path = "/mno/objectKey/{id}/{name}", method = RequestMethod.GET)
public Book getBook(@PathVariable int id, @PathVariable String name) {
    // code here
}

(2) Comment pouvons-nous passer et analyser les paramètres dans Ex.1?

Ajoutez simplement deux paramètres de requête et indiquez le chemin correct.

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.GET)
public Book getBook(@RequestParam int id, @RequestParam String name) {
    // code here
}

UPDATE(du commentaire)

Et si nous avons une structure de paramètre compliquée?

"A": [ {
    "B": 37181,
    "timestamp": 1160100436,
    "categories": [ {
        "categoryID": 2653,
        "timestamp": 1158555774
    }, {
        "categoryID": 4453,
        "timestamp": 1158555774
    } ]
} ]

Envoyez-le en tant que POST avec les données JSON dans le corps de la demande, pas dans l'URL, et spécifiez un type de contenu de application/json.

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.POST, consumes = "application/json")
public Book getBook(@RequestBody ObjectKey objectKey) {
    // code here
}
43
Andreas

vous pouvez passer plusieurs paramètres dans l'URL comme 

http: // localhost: 2000/custom? marque = Dell & limit = 20 & prix = 20000 & sort = asc

et pour obtenir ces champs de requête, vous pouvez utiliser une carte comme

    @RequestMapping(method = RequestMethod.GET, value = "/custom")
    public String controllerMethod(@RequestParam Map<String, String> customQuery) {

        System.out.println("customQuery = brand " + customQuery.containsKey("brand"));
        System.out.println("customQuery = limit " + customQuery.containsKey("limit"));
        System.out.println("customQuery = price " + customQuery.containsKey("price"));
        System.out.println("customQuery = other " + customQuery.containsKey("other"));
        System.out.println("customQuery = sort " + customQuery.containsKey("sort"));

        return customQuery.toString();
    }
8
Om Sharma

Oui, il est possible de passer un objet JSON dans une URL.

queryString = "{\"left\":\"" + params.get("left") + "}";
 httpRestTemplate.exchange(
                    Endpoint + "/A/B?query={queryString}",
                    HttpMethod.GET, entity, z.class, queryString);
0
techspl

Plusieurs paramètres peuvent être donnés comme ci-dessous,

    @RequestMapping(value = "/mno/{objectKey}", method = RequestMethod.GET, produces = "application/json")
    public List<String> getBook(HttpServletRequest httpServletRequest, @PathVariable(name = "objectKey") String objectKey
      , @RequestParam(value = "id", defaultValue = "false")String id,@RequestParam(value = "name", defaultValue = "false") String name) throws Exception {
               //logic
}
0
Rohit Dubey