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
public APIApplication() { //Load Resource register(HelloResource.class); //Registrieren Sie das Datenkonverterregister( JacksonJsonProvider.class ); // Logging. register(LoggingFilter.class);
}
}
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🎜>
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 } ...
}
public String get(@Context UriInfo ui) {
MultivaluedMap
MultivaluedMap
}
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:
}
Dann verwenden Sie es im REST-Dienst:
@Path("/user")public class UserResource { @POST @Produces("application / json") public OptionResult create(@BeanParam User user) { ... }
}
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!