Używam jQuery $.getJSON()
do wykonywania asynchronicznych wywołań do mojego prostego zaplecza Spring MVC. Większość metod kontrolera Spring wygląda następująco:
@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
@RequestParam("type") String type) {
return someDAO.getSomeData(widget, type);
}
Mam rzeczy skonfigurowane tak, aby każdy kontroler zwracał @ResponseBody
jako JSON, czego oczekuje po stronie klienta.
Ale co się dzieje, gdy żądanie nie powinno zwrócić żadnej treści po stronie klienta? Czy mogę dostać:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
...
}
Jeśli nie, jaka jest odpowiednia składnia do użycia w tym miejscu?
java
jquery
spring-mvc
IAmYourFaja
źródło
źródło
POST
danych.Odpowiedzi:
możesz zwrócić void, wtedy musisz oznaczyć metodę @ResponseStatus (value = HttpStatus.OK) nie potrzebujesz @ResponseBody
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) @ResponseStatus(value = HttpStatus.OK) public void updateDataThatDoesntRequireClientToBeNotified(...) { ... }
Tylko metody get zwracają niejawność kodu stanu 200, wszystkie inne, które masz, wykonują jedną z trzech rzeczy:
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
HttpEntity
instancjęźródło
@ResponseStatus
i nie powinieneś. Po prostu mając@ResponseBody
navoid
przewodnika jest w porządku wystarczy.Możesz po prostu zwrócić ResponseEntity z odpowiednim nagłówkiem:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){ .... return new ResponseEntity(HttpStatus.OK) }
źródło
ResponseEntity is a raw type. References to generic type ResponseEntity<T> should be parameterized
Możesz zwrócić obiekt „ResponseEntity”. Korzystanie z obiektu „ResponseEntity” jest bardzo wygodne zarówno podczas konstruowania obiektu odpowiedzi (zawierającego treść odpowiedzi i kod stanu HTTP), jak i podczas pobierania informacji z obiektu odpowiedzi.
Metody takie jak getHeaders (), getBody (), getContentType (), getStatusCode () itp. Sprawiają, że odczytanie obiektu ResponseEntity jest bardzo łatwe.
Należy używać obiektu ResponseEntity z kodem stanu HTTP 204 (brak treści), który służy konkretnie do określenia, że żądanie zostało przetworzone poprawnie, a treść odpowiedzi jest celowo pusta. Używanie odpowiednich kodów stanu do przekazywania właściwych informacji jest bardzo ważne, zwłaszcza jeśli tworzysz interfejs API, który będzie używany przez wiele aplikacji klienckich.
źródło
@ResponseStatus(HttpStatus.NO_CONTENT)
rozwiązaneXML Parsing Error: no root element found
dla mnie w przeglądarceTak, możesz użyć @ResponseBody z
void
typem zwrotu:@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST) @ResponseBody public void updateDataThatDoesntRequireClientToBeNotified(...) { ... }
źródło
Nie ma nic złego w zwracaniu unieważnienia
@ResponseBody
i należy o toPOST
poprosić.Zamiast tego użyj kodów stanu HTTP, aby zdefiniować błędy w procedurach obsługi wyjątków, ponieważ inni wspominają o stanie sukcesu. Normalna metoda, jaką masz, zwróci kod odpowiedzi,
200
którego chcesz, każdy program obsługi wyjątków może następnie zwrócić obiekt błędu i inny kod (tj500
.).źródło
Ale w miarę jak twój system rośnie pod względem rozmiaru i funkcjonalności ... myślę, że zwracanie zawsze jsona nie jest wcale złym pomysłem. To bardziej kwestia architektoniczna / „projektowanie na dużą skalę”.
Możesz pomyśleć o zachowaniu zawsze JSON z dwoma znanymi polami: kodem i danymi. Gdzie kod jest kodem numerycznym określającym powodzenie operacji do wykonania, a dane to wszelkie dodatkowe dane związane z żądaną operacją / usługą.
Chodź, kiedy korzystamy z zaplecza dostawcy usług, każdą usługę można sprawdzić, aby sprawdzić, czy działa dobrze.
Więc trzymam się, żeby wiosna nie zarządzała tym, ujawniając hybrydowe operacje zwrotne (niektóre zwracają dane, inne nic ...) .. natychmiast upewnij się, że twój serwer udostępnia bardziej jednorodny interfejs. Pod koniec dnia jest prostsze.
źródło
Oto przykładowy kod, który zrobiłem dla metody asynchronicznej
@RequestMapping(value = "/import", method = RequestMethod.POST) @ResponseStatus(value = HttpStatus.OK) public void importDataFromFile(@RequestParam("file") MultipartFile file) { accountingSystemHandler.importData(file, assignChargeCodes); }
Nie musisz zwracać niczego ze swojej metody, wszystko czego potrzebujesz, aby użyć tej adnotacji aby Twoja metoda w każdym przypadku zwracała OK
@ResponseStatus(value = HttpStatus.OK)
źródło