Jak uzyskać dostęp do parametrów w metodzie RESTful POST
Moja metoda POST wygląda tak:
@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ę post wygląda tak:
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 wyjście na serwerze:
INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 =
Co muszę zmienić, aby parametry dawały prawidłową wartość?
1 answers
Twoja metoda @POST
powinna przyjmować obiekt JSON zamiast ciągu znaków. Jersey używa JAXB do obsługi marshalingu i unmarshalingu obiektów JSON(zobacz dokumenty jersey po szczegóły ). Utwórz klasę podobną do:
@XmlRootElement
public class MyJaxBean {
@XmlElement public String param1;
@XmlElement public String param2;
}
Wtedy twoja metoda @POST
wyglądałaby następująco:
@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
System.out.println("param1 = " + input.param1);
System.out.println("param2 = " + input.param2);
}
Ta metoda spodziewa się otrzymać obiekt JSON jako ciało postu HTTP. JAX-RS przekazuje treść wiadomości HTTP jako niezapowiedziany parametr -- input
w tym przypadku. Na rzeczywista wiadomość wyglądałaby mniej więcej tak:
POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com
{"param1":"hello","param2":"world"}
Używanie JSON w ten sposób jest dość powszechne z oczywistych powodów. Jeśli jednak generujesz lub zużywasz je w czymś innym niż JavaScript, musisz uważać, aby poprawnie uciec od danych. W JAX-RS, można użyć MessageBodyReader i MessageBodyWriter do zaimplementowania tego. Uważam, że Jersey ma już implementacje dla wymaganych typów (np. Java primitives i JAXB klas), 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 będą opisywane za pomocą @ FormParam :
@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
@FormParam("param2") String param2) {
...
}
W tym celu należy wykonać następujące czynności: JAX-RS runtime zajmie się dekodowaniem ciała i przekazywaniem go do metoda. Oto, co powinieneś zobaczyć na drucie:
POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25
param1=hello¶m2=world
Treść jest URL zakodowany w tym przypadku.
Jeśli nie znasz nazw FormParam ' s, możesz wykonać następujące czynności:
@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
...
}
Nagłówki HTTP
Możesz użyć adnotacji @HeaderParam jeśli chcesz przekazać parametry za pomocą nagłówków HTTP:
@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
@HeaderParam("param2") String param2) {
...
}
Oto jak wyglądałaby wiadomość HTTP. Zauważ, że ten POST nie ma ciało.
POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world
Nie używałbym tej metody do przekazywania uogólnionych parametrów. Jest to bardzo przydatne, jeśli chcesz uzyskać dostęp do wartości konkretnego nagłówka HTTP.
Parametry zapytań HTTP
Ta metoda jest używana głównie z http GETs, ale ma również zastosowanie do postów. Używa adnotacji @QueryParam.
@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
@QueryParam("param2") String param2) {
...
}
Podobnie jak poprzednia technika, przekazywanie parametrów przez łańcuch zapytania nie wymaga treści wiadomości. Oto wiadomość HTTP:
POST /create?param1=hello¶m2=world HTTP/1.1
Content-Length: 0
Host: www.example.com
Musisz być szczególnie ostrożny, aby poprawnie zakodować parametry zapytania Po stronie klienta. Używanie parametrów kwerendy może być problematyczne ze względu na ograniczenia długości adresów URL wymuszane przez niektóre proxy, a także problemy związane z ich kodowaniem.
Parametry ścieżki HTTP
Parametry ścieżki są podobne do parametrów zapytania, z tym wyjątkiem, że są osadzone w ścieżce zasobów HTTP. Metoda ta wydaje się być dziś za. 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 :
@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
@PathParam("param2") String param2) {
...
}
Wiadomość jest podobna do parametru query version z tym wyjątkiem, że nazwy parametrów nie są nigdzie zawarte w wiadomości.
POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com
Ta metoda ma takie samo kodowanie jak zapytanie wersja parametru. segmenty ścieżek są kodowane inaczej więc tam też musisz być ostrożny.
Jak widzisz, każda metoda ma swoje plusy i minusy. O wyborze decydują zazwyczaj twoi klienci. Jeśli obsługujesz strony HTML oparte na FORM
, użyj @FormParam
. Jeśli Twoje klienty są oparte na JavaScript+HTML5, prawdopodobnie będziesz chciał użyć serializacji opartej na JAXB i obiektów JSON. MessageBodyReader/Writer
implementacje powinny zadbać o niezbędne dla to jest jedna rzecz mniej, która może pójść źle. Jeśli twój Klient jest oparty na Javie, ale nie ma dobrego procesora XML (np. Android), prawdopodobnie użyłbym kodowania FORM
, ponieważ treść jest łatwiejsza do wygenerowania i poprawnego kodowania niż adresy URL. Mam nadzieję, że ten wpis mini-wiki rzuci trochę światła na różne metody, które obsługuje JAX-RS.
Uwaga: w interesie pełnego ujawnienia, nie użyłem jeszcze tej funkcji Jersey. Majstrowaliśmy przy tym ponieważ wdrożyliśmy wiele aplikacji JAXB + JAX-RS i przenosimy się do przestrzeni klienta mobilnego. JSON jest o wiele lepiej dopasowany niż XML w rozwiązaniach opartych na HTML5 lub jQuery.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 14:02:53