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;
}
}
(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
}
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();
}
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);
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
}