10 Ağustos 2020 Pazartesi

SpringMVC @RequestBody Anotasyonu - Http Post İsteğindeki Json Verisini Java Nesnesine Çevirir

Giriş
Açıklaması şöyle. POST/PUT gibi işlemlerde, Http içindeki veriyi nesneye çevirmek içindir.
@RequestBody annotated parameter is expected to hold the entire body of the request and bind to one object.
Açıklaması şöyle.
@RequestBody annotation maps the HttpRequest body to a transfer or domain object, enabling automatic deserialization of the inbound HttpRequest body onto a Java object.
İmzası şöyle.
@Target(value=PARAMETER)
@Retention(value=RUNTIME)
@Documented
public @interface RequestBody

/*Annotation indicating a method parameter should be bound to the body of the
  web request. The body of the request is passed through an
  HttpMessageConverter to resolve the method argument depending on the 
  content type of the request.*/
GET vs POST İsteği
HTTP Get isteğinde Request Body göndermek mümkün ancak yapılmaması lazım.

Örnek
Şöyle yaparız
// In a standard POST mapping, you are able to specify a @RequestBody.
@PostMapping("/pokemon")
public Pokemon addPokemon(@RequestBody PokemonAddRequest pokemonAddRequest) {
  ...
}

// It turns out, you can write your @GetMapping in the same way, 
// albeit without the @RequestBody annotation.
@GetMapping("/pokemon")
public Pokemon getPokemon(PokemonSearchRequest pokemonSearchRequest) {
  ...
}
Yanlış Kullanım
Örnek
Spring nesnenin tipini tam olarak bilmek zorundadır. Yoksa Json metnini hangi nesneye çevireceğini bilemez. Şu kod yanlış
void foo (@RequestBody Object reqBody);
Örnek
Açıklaması şöyle. Metod imzasında tek bir @RequestBody nesnesi olabilir.
@RequestBody annotated parameter is expected to hold the entire body of the request and bind to one object
Şu kod yanlış
void foo (@RequestBody Foo foo1, @RequestBody Foo foo2);
Doğru Kullanım
Örnek
Elimizde şöyle bir kod olsun
public class DataRequest {
  private Integer value1;
  private Integer value2;
  ...
}
Post isteği ile gönderilen Http içindeki Json nesnesini otomatik olarak Java nesnesine çevirmek için şöyle yaparız
@PostMapping(value = "/addNumber")
public String controllerMethod(@RequestBody DataRequest request){
  Integer value1 = request.getValue1();
  Integer value2 = request.getValue2();
  ...
  String res= ...;
  return res;
}
Çağırmak için şöyle yaparız.
var v1 = document.getElementById('n1').value;
var v2 = document.getElementById('n2').value;
var str = "{value1:} + v1 + ", value2:" + v2 + "}";
var xmlhttp = new XMLHttpRequest(); 
xhttp.open("POST", "http://localhost:8080/Cloudnet/login/addNumber", true);
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(str));

Hiç yorum yok:

Yorum Gönder