Heim  >  Artikel  >  Java  >  Zusammenfassung der Java Jersey2-Nutzung

Zusammenfassung der Java Jersey2-Nutzung

高洛峰
高洛峰Original
2016-12-17 14:47:321486Durchsuche

Einführung

Jersey ist eine Open-Source-Referenzimplementierung von JAX-RS (JSR311) zum Erstellen von RESTful-Webdiensten. Sie enthält drei Teile:

Kernserver: Durch die Bereitstellung von JSR Die Anmerkungen und Die in 311 standardisierte API-Standardisierung ermöglicht die intuitive Entwicklung von RESTful-Webdiensten.

Core Client: Die Jersey-Client-API kann Entwicklern helfen, einfach mit RESTful-Diensten zu kommunizieren.

Integration: Jersey bietet auch eine einfache Vererbung von Spring, Guice und der Apache Abdera-Bibliothek.​​ ​

Jersey2.0 wurde in dieser Entwicklung verwendet und nur der Kernserver wurde verwendet.

Jersey-Umgebung einrichten

Maven

org.glassfish.jersey.containers< /groupId> jersey-container-servlet-core GroupId> javax.xml.ws dependency> org.codehaus.jackson jackson-core-asl groupId> org.codehaus.jackson 1.9.12 codehaus. jackson >Kopieren Sie die folgenden Bibliotheken aus dem Jersey-Entwicklungspaket in das Bibliotheksverzeichnis unter WEB-INF:

Server: Jersey-Server.jar, Jersey-Container-Servlet-Core.jar, Jersey-Container-Servlet.jar, javax.ws.rs-api-2.0.jar

Client: Jersey-Client.jar

Common: Jersey-Common.jar

JSON-Unterstützung: In Jersey2 .0 muss Jackson1.9 JSON unterstützen.

Hello World

Das Folgende zeigt eine Hello World

Schritt 1: Schreiben Sie eine Ressource namens HelloResource, die HTTP-Get-Anfragen akzeptiert und auf „Hello Jersey“ antwortet

@Path("/hello")public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String sayHello() { return "Hello Jersey"

Schritt 2: JAX-RS-Anwendung schreiben

public class APIApplication erweitert ResourceConfig {

public APIApplication() { //Load Resource register(HelloResource.class); //Registrieren Sie das Datenkonverterregister( JacksonJsonProvider.class ); // Logging. register(LoggingFilter.class);
}
}

Schritt 3: Definieren Sie den Servelt-Scheduler in der web.xml-Datei für den Zweck Alle REST-Anfragen senden zum Jersey-Container. Zusätzlich zur Deklaration des Jersey-Servlets müssen Sie auch einen Initialisierungsparameter definieren, um die JAX-RS-Anwendung anzugeben.


JerseyServlet org.glassfish.jersey .servlet.ServletContainer javax.ws.rs.Applicationcn.com.mink.resource.APIApplication< ;/param-value> JerseyServlet /services/*


Schritt 4: Programm testen

Geben Sie den folgenden Befehl in das Befehlsterminal ein und Sie sehen „Hallo Jersey“.

curl http://host:port/services/hello

Oder geben Sie die folgende URL in den Browser ein, Sie sehen „Hallo Jersey“

http://host:port/services/hello 

Verwenden Sie die

-Ressource

Root-Ressource und Sub-Ressource

Ressourcen sind ein wichtiger Bestandteil von RESTful-Diensten und können mit HTTP-Methoden (wie GET, POST, PUT und DELETE) betrieben werden. In JAX-RX werden Ressourcen über POJOs implementiert, wobei @Path-Annotationen zur Bildung ihrer Bezeichner verwendet werden. Ressourcen können untergeordnete Ressourcen haben. Die übergeordnete Ressource ist eine Ressourcensammlung und die untergeordneten Ressourcen sind Mitgliedsressourcen.

Im folgenden Beispielcode ist

Resources eine Sammlungsressource, die aus dem URI „/services“ besteht, und UserResource ist eine Mitgliedsressource, die aus dem URI „/services/user“ besteht;

@Path("/services")public class Resources { @Path("/user") public UserResource getUserResource() { ... } @Path("/book") public BookResource getBookResource() { ... }
}

UserResource ist eine Ressourcensammlung bestehend aus dem URI „/user“ und getUser ist eine Ressourcenmethode bestehend aus dem URI „/user/{username}“

@Path("/ user") public class UserResource { @GET @Path("{username"}) @Produces("application/json") public User getUser(@PathParam("username") String userName) { .. . }
}

HTTP-Methoden

HTTP-Methoden werden CRUD-Vorgängen (Erstellen, Lesen, Aktualisieren und Löschen) von Ressourcen zugeordnet. Der Grundmodus ist wie folgt:

HTTP GET: Lesen/Auflisten/Abrufen einer einzelnen oder einer Sammlung von Ressourcen.

HTTP-POST: Erstellen Sie eine neue Ressource.

HTTP PUT: Vorhandene Ressourcen oder Ressourcensammlungen aktualisieren.

HTTP DELETE: Eine Ressource oder Ressourcensammlung löschen. Die Annotation

@Produces

@Produces wird verwendet, um den Datenidentifikationstyp (MIME) anzugeben, der an den Client zurückgegeben werden soll. @Produces kann als Klassenanmerkung oder Methodenanmerkung verwendet werden. Die Annotation @Produces der Methode überschreibt die Annotation der Klasse.

Geben Sie einen MIME-Typ an

@Produces("application/json")

Geben Sie mehrere MIME-Typen an

@Produces({"application/json","application/xml"})

@Consumes

@Consumes with @ Im Gegenteil, es wird verwendet, um den MIME-Typ anzugeben, der vom Client gesendet werden kann. Es kann auch für Klassen oder Methoden verwendet werden. Es wird im Allgemeinen für @PUT und @POST verwendet.

Parameteranmerkungen

Parameteranmerkungen werden verwendet, um die vom Client gesendeten Daten abzurufen. In diesem Artikel werden nur häufig verwendete Anmerkungen vorgestellt. Weitere Informationen finden Sie im Jersey-Benutzerhandbuch

@PathParam

Verwenden Sie @PathParam, um die Parameter der im URI angegebenen Regeln abzurufen, z. B.:

@GET @Path("{username"})@Produces(MediaType.APPLICATION_JSON)public User getUser(@PathParam("username") String userName) {
...
}

Wenn der Browser http://localhost/user/jack anfordert, ist der userName-Wert jack.

@QueryParam

@QueryParam wird verwendet, um die Abfrageparameter in der GET-Anfrage abzurufen, wie zum Beispiel:

@GET@Path("/user")@Produces( "text/ plain")public User getUser(@QueryParam("name") String name, @QueryParam("age") int age) {
...
}

Wenn der Browser http://host:port/user?name=rose&age=25 anfordert, ist der Namenswert Rose und der Alterswert 25. Wenn Sie einen Standardwert für einen Parameter festlegen müssen, können Sie @DefaultValue verwenden, z. B.:

@GET@Path("/user")@Produces("text/plain")public User getUser( @QueryParam("name" ) Zeichenfolgenname, :port/user?name=rose , der Namenswert ist Rose und der Alterswert ist 26.

@FormParam

@FormParam ruft, wie der Name schon sagt, Daten aus den Formularparametern der POST-Anfrage ab. Zum Beispiel:

@POST@Consumes("application/x-www-form-urlencoded")public void post(@FormParam("name") String name) { // Speichern Sie die Nachricht🎜>

@BeanParam

Wenn beispielsweise viele Anforderungsparameter vorhanden sind, sendet der Client eine PUT-Anfrage, um den Benutzer zu ändern, und die Anforderung enthält viele Benutzerinformationen. Sie können zu diesem Zeitpunkt @BeanParam verwenden.

@POST@Consumes("application/x-www-form-urlencoded")public void update(@BeanParam User user) { // Speichern Sie die Benutzerdaten}


Benutzer Das Bean ist wie folgt definiert:

@XmlRootElement(name = "user")

public class User { @PathParam("userName) private String userName; @FormParam("name") private String name; @FormParam( "telephone") private String phone; @FormParam("email") private String email; public String getUserName() public void setUserName(String userName) { this.userName = userName } ...
}

Verwenden von Map

Auf einem großen Server treten aufgrund der sich ändernden Parameter derzeit Probleme bei der Anpassung der Parameterstruktur auf , können Sie die Annotation @Context verwenden und die UriInfo-Instanz wie folgt abrufen:

@GET

public String get(@Context UriInfo ui) {
MultivaluedMap queryParams = ui .getQueryParameters();
MultivaluedMap pathParams = ui.getPathParameters();
}

kann auch über die @Context-Annotation ServletConfig, ServletContext, H ttpServletRequest abgerufen werden. HttpServletResponse und HttpHeaders usw., wie folgt:

@Path("/")public class Resource { @Context HttpServletRequest req; @Context ServletContext servletContext; @GET public String get(@Context HttpHeaders hh) { MultivaluedMap headerParams = hh.getRequestHeaders(); Map Xml


JAX-RS unterstützt die Bindung von JavaBeans an XML oder JSON und umgekehrt mithilfe von JAXB (Java API for XML Binding). JavaBean muss mit @XmlRootElement annotiert werden. Felder ohne @XmlElement-Annotation enthalten ein XML-Element mit demselben Namen wie folgt:

@XmlRootElementpublic class OptionResult { @XmlElement(name = "code") private String result; private String errorMsg; public String getResult() { return result; public void setResult = result; } public String getErrorMsg() { return errorMsg; = errorMsg; }

}

Dann verwenden Sie es im REST-Dienst:


@Path("/user")public class UserResource { @POST @Produces("application / json") public OptionResult create(@BeanParam User user) { ... }
}

Registrieren Sie abschließend den Datenkonverter, der JavaBeans automatisch in JSON-Daten konvertiert:


public class APIApplication erweitert ResourceConfig {
public APIApplication() { //Load Model register(OptionResult.class); //Load Model with the same package as OptionResult //packages(OptionResult.class.getPackage (). getName()); //Ressourcenregister laden(UserResource.class); //Datenkonverter registrieren(JacksonJsonProvider.class);

}

Hinweis: Das Prinzip der Rückgabe von XML-Daten ist dasselbe, nur der Datenkonverter ist anders. Sie müssen nur den XML-Datenkonverter gleichzeitig in APIApplication registrieren. Weitere Informationen finden Sie im Jersey-Benutzerhandbuch

Problemzusammenfassung

Ajax-Anfragen (POST, PUT und DELETE) können keine Daten an den Jersey-Container senden

Problembeschreibung

Bei der Entwicklung der SMS-Plattform wird das CRUD der Daten vollständig mithilfe der Ajax-Technologie vervollständigt, daher müssen POST-, PUT- und DELETE-Anfragen verwendet werden. Der Inhaltstyp dieser drei Anfragen ist „application/x-www-form-urlencoded; UTF-8“. Beim Debuggen des Programms mithilfe der Tamperdata-Erweiterung von Firefox wurde festgestellt, dass der Jersey-Container die übermittelten Daten über die Annotation @FormParam abrufen kann, wenn der Inhaltstyp „application/x-www-form-urlencoded“ ist Der Inhaltstyp ist „ application/x-www-form-urlencoded; UTF-8“ und kann nicht abgerufen werden.

Lösung

Schließlich habe ich das Problem mithilfe von Java Filter und Jersey RequestFilter gelöst. Verwenden Sie zunächst UTF8 im Java-Filter, um die Daten in der Anforderung zu codieren, und ändern Sie dann den Inhaltstyp im Anforderungsobjekt in „application/x-www-form-urlencoded“ in Jersey RequestFilter. Zum Beispiel:

public void doFilter(ServletRequest request, ServletResponse Response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; req.setCharacterEncoding("UTF-8");
} öffentliche Klasse RequestFilter implementiert ContainerRequestFilter { @Override public void filter(ContainerRequestContext context) throws IOException { String headerString = context.getHeaderString("content-type"); if (headerString != null) { //Wenn content-type mit „application /x -www-form-urlencoded", dann verarbeiten if (headerString.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) context.getHeaders().putSingle("content-type", MediaType.APPLICATION_FORM_URLENCODED); } }
}

Registrieren Sie schließlich Java Filter in web.xml (zu registrieren vor dem Jersey-Container) und registrieren Sie Jersey RequestFilter in APIApplication wie folgt:

öffentliche Klasse APIApplication erweitert ResourceConfig {
public APIApplication () {
register(RequestFilter.class);
}
}

Erklärung

: Nach der Behebung dieses Problems Jersey-Quellcode auf Github Ich habe im Lager gesehen, dass dieses Problem in der nächsten offiziellen Version von Jersey nicht mehr auftreten sollte. Weitere Informationen finden Sie in dieser Diskussion



Weitere Artikel zur Zusammenfassung der Verwendung von Java Jersey2 finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn