Ich versuche herauszufinden, ob es möglich ist, ein JSON-Objekt an die Rest-API zu übergeben oder mehrere Parameter an diese API zu übergeben. Und wie liest man diese Parameter im Frühling? Nehmen wir an, die URL sieht wie in den folgenden Beispielen aus:
Beispiel 1 http://localhost:8080/api/v1/mno/objectKey?id=1&name=saif
Ist es gültig, ein JSON-Objekt wie in der folgenden URL zu übergeben?
Ex.2 http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}
Fragen:
1) Kann ein JSON-Objekt wie in Beispiel 2 an die URL übergeben werden?
2) Wie können wir die Parameter in Beispiel 1 übergeben und analysieren?
Ich habe versucht, einige Methoden zu schreiben, um mein Ziel zu erreichen, konnte aber nicht die richtige Lösung finden.
Ich habe versucht, das JSON-Objekt als @RequestParam zu übergeben
http://localhost:8080/api/v1/mno/objectKey?id=1
Es ist ein unerwarteter Fehler aufgetreten. (type=Unsupported Media Type, status=415). Content type 'null' not supported
http://localhost:8080/api/v1/mno/objectKey/id=1
Es ist ein unerwarteter Fehler aufgetreten. (type=Not Found, status=404). No message available
http://localhost:8080/api/v1/mno/objectKey/%7B%22id%22:1%7D
Es ist ein unerwarteter Fehler aufgetreten. (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) {
...
}
Ich habe versucht, das JSON-Objekt als @PathVariable zu übergeben
@RequestMapping(value="ghi/{objectKey}",method = RequestMethod.GET)
public List<Book> getBook2(@PathVariable ObjectKey objectKey) {
...
}
Ich habe dieses Objekt erstellt, um den id-Parameter und andere Parameter wie name usw. aufzunehmen.
class ObjectKey{
long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
(1) Kann ein JSON-Objekt wie in Beispiel 2 an die URL übergeben werden?
Nein, weil http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}
keine gültige URL ist.
Wenn Sie es REST-fähig machen möchten, verwenden Sie http://localhost:8080/api/v1/mno/objectKey/1/Saif
und definieren Sie Ihre Methode folgendermaßen:
@RequestMapping(path = "/mno/objectKey/{id}/{name}", method = RequestMethod.GET)
public Book getBook(@PathVariable int id, @PathVariable String name) {
// code here
}
(2) Wie können wir die Parameter in Beispiel 1 übergeben und analysieren?
Fügen Sie einfach zwei Anforderungsparameter hinzu und geben Sie den richtigen Pfad an.
@RequestMapping(path = "/mno/objectKey", method = RequestMethod.GET)
public Book getBook(@RequestParam int id, @RequestParam String name) {
// code here
}
UPDATE(aus Kommentar)
Was ist, wenn wir eine komplizierte Parameterstruktur haben?
"A": [ { "B": 37181, "timestamp": 1160100436, "categories": [ { "categoryID": 2653, "timestamp": 1158555774 }, { "categoryID": 4453, "timestamp": 1158555774 } ] } ]
Senden Sie das als POST
mit den JSON-Daten im Anforderungstext und nicht in der URL. Geben Sie als Inhaltstyp application/json
an.
@RequestMapping(path = "/mno/objectKey", method = RequestMethod.POST, consumes = "application/json")
public Book getBook(@RequestBody ObjectKey objectKey) {
// code here
}
sie können mehrere Parameter in URL wie übergeben
http: // localhost: 2000/custom? brand = Dell & limit = 20 & price = 20000 & sort = asc
und um diese Abfragefelder zu erhalten, können Sie map like verwenden
@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();
}
Ja, es ist möglich, ein JSON-Objekt als URL zu übergeben
queryString = "{\"left\":\"" + params.get("left") + "}";
httpRestTemplate.exchange(
Endpoint + "/A/B?query={queryString}",
HttpMethod.GET, entity, z.class, queryString);
Mehrere Parameter können wie folgt angegeben werden:
@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
}