Moja metoda POST wygląda następująco:
@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
System.out.println("param1 = " + param1);
System.out.println("param2 = " + param2);
}
Kiedy tworzę klienta Jersey w Netbeans, metoda wywołująca metodę wysyłania wygląda następująco:
public void create(Object requestEntity){
webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}
Podczas wykonywania tego testu:
@Test
public void hello(){
String json = "{param1=\"hello\",param2=\"hello2\"}";
this.client.create(json);
}
Daje następujące dane wyjściowe na serwerze:
INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 =
Co muszę zmienić, aby parametry miały prawidłową wartość?
Odpowiedzi:
Twoja
@POST
metoda powinna akceptować obiekt JSON zamiast ciągu. Jersey używa JAXB do obsługi organizowania i unmarshalowania obiektów JSON (szczegóły w dokumentacji koszulki ). Utwórz zajęcia takie jak:Wtedy Twoja
@POST
metoda wyglądałaby następująco:Ta metoda oczekuje, że otrzyma obiekt JSON jako treść HTTP POST. JAX-RS przekazuje treść wiadomości HTTP jako parametr bez adnotacji -
input
w tym przypadku. Rzeczywista wiadomość wyglądałaby mniej więcej tak:Używanie JSON w ten sposób jest dość powszechne z oczywistych powodów. Jeśli jednak generujesz lub konsumujesz go w czymś innym niż JavaScript, musisz uważać, aby odpowiednio uciec przed danymi. W JAX-RS do zaimplementowania tego można użyć MessageBodyReader i MessageBodyWriter . Uważam, że Jersey ma już implementacje dla wymaganych typów (np. Prymitywy Java i klasy opakowane JAXB), a także dla JSON. JAX-RS obsługuje wiele innych metod przekazywania danych. Nie wymagają one tworzenia nowej klasy, ponieważ dane są przekazywane za pomocą prostego przekazywania argumentów.
HTML
<FORM>
Parametry zostaną opatrzone adnotacjami za pomocą @FormParam :
Przeglądarka zakoduje formularz przy użyciu „application / x-www-form-urlencoded” . Środowisko wykonawcze JAX-RS zajmie się zdekodowaniem treści i przekazaniem jej do metody. Oto, co powinieneś zobaczyć na przewodzie:
W tym przypadku zawartość jest zakodowana w postaci adresu URL .
Jeśli nie znasz nazw parametrów FormParam, możesz wykonać następujące czynności:
Nagłówki HTTP
Możesz użyć adnotacji @HeaderParam, jeśli chcesz przekazywać parametry przez nagłówki HTTP:
Oto jak wyglądałby komunikat HTTP. Zauważ, że ten post nie ma treści.
Nie użyłbym tej metody do uogólnionego przekazywania parametrów. Jest to jednak bardzo przydatne, jeśli chcesz uzyskać dostęp do wartości określonego nagłówka HTTP.
Parametry zapytania HTTP
Ta metoda jest używana głównie z HTTP GET, ale ma również zastosowanie do POST. Używa adnotacji @QueryParam .
Podobnie jak w poprzedniej technice, przekazywanie parametrów za pośrednictwem ciągu zapytania nie wymaga treści wiadomości. Oto wiadomość HTTP:
Musisz być szczególnie ostrożny, aby poprawnie zakodować parametry zapytania po stronie klienta. Korzystanie z parametrów zapytania może być problematyczne ze względu na ograniczenia długości adresów URL narzucane przez niektóre serwery proxy, a także problemy związane z ich kodowaniem.
Parametry ścieżki HTTP
Parametry ścieżki są podobne do parametrów zapytania, z tą różnicą, że są osadzone w ścieżce zasobów HTTP. Ta metoda wydaje się być dziś korzystna. Istnieją skutki w odniesieniu do buforowania HTTP, ponieważ ścieżka jest tym, co naprawdę definiuje zasób HTTP. Kod wygląda trochę inaczej niż pozostałe, ponieważ adnotacja @Path została zmodyfikowana i używa @PathParam :
Wiadomość jest podobna do wersji parametru zapytania, z tym wyjątkiem, że nazwy parametrów nie są nigdzie zawarte w wiadomości.
Ta metoda ma te same problemy z kodowaniem, co wersja parametru zapytania. Segmenty ścieżek są kodowane w różny sposób, więc również musisz zachować ostrożność.
Jak widać, każda metoda ma swoje wady i zalety. O wyborze najczęściej decydują Twoi klienci. Jeśli wyświetlasz
FORM
strony HTML oparte na wyświetlaniu, użyj@FormParam
. Jeśli Twoi klienci są oparte na JavaScript + HTML5, prawdopodobnie będziesz chciał użyć serializacji opartej na JAXB i obiektów JSON. WMessageBodyReader/Writer
implementacje powinny dbać o konieczności ucieczki dla Ciebie tak, że jest jeden mniej, co może się nie udać. Jeśli twój klient jest oparty na Javie, ale nie ma dobrego procesora XML (np. Android), prawdopodobnie użyłbymFORM
kodowania, ponieważ treść treści jest łatwiejsza do wygenerowania i zakodowania poprawnie niż adresy URL. Miejmy nadzieję, że ten wpis na mini-wiki rzuci trochę światła na różne metody obsługiwane przez JAX-RS.Uwaga: w celu pełnego ujawnienia, tak naprawdę nie korzystałem jeszcze z tej funkcji Jersey. Majstrowaliśmy przy tym, ponieważ mamy wiele wdrożonych aplikacji JAXB + JAX-RS i przenosimy się do mobilnej przestrzeni klienta. JSON znacznie lepiej pasuje do XML w rozwiązaniach opartych na HTML5 lub jQuery.
źródło