はじめに
Jersey は、RESTful Web サービスを構築するための JAX-RS (JSR311) のオープンソース リファレンス実装であり、次の 3 つの部分で構成されています。
Core Server: JSR 311 で標準化されたアノテーションと API 標準化を提供することで、RESTful Web を開発できます。直感的な方法でサービスを提供します。
コアクライアント: Jersey クライアント API は、開発者が RESTful サービスと簡単に通信できるようにします。
統合 (統合): Jersey は、Spring、Guice、および Apache Abdera を簡単に継承できるライブラリも提供します。
この開発ではJersey2.0を使用し、コアサーバーのみを使用します。
Jersey 環境をセットアップする
Maven
Jar ファイル方式の紹介
Jersey 開発パッケージから WEB-INF のライブラリ ディレクトリに次のライブラリをコピーします。
サーバー: Jersey-server.jar、jersey-Container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api-2.0.jar
クライアント: Jersey-client.jar
common: Jersey-common.jar
json サポート: json をサポートするには、Jersey2.0 で Jackson1.9 を使用する必要があります。
Hello World
以下は Hello World を示します
ステップ 1: HelloResource という名前のリソースを作成します。これは、Http Get リクエストを受け入れ、「Hello Jersey」に応答します
@Path("/hello") public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public StringsayHello() { return "Hello Jersey"; }
}
ステップ 2: JAX-RS アプリケーションを作成する
public class APIApplication extends ResourceConfig {
public APIApplication() { / /Load Resource register(HelloResource.class); // データ コンバータを登録します register(JacksonJsonProvider.class);
}
}
ステップ 3: サーベルト スケジューラは、すべての REST リクエストを Jersey コンテナに送信することを目的として、xml ファイルで定義されます。 Jersey Servletの宣言に加えて、JAX-RSアプリケーションを指定する初期化パラメータも定義する必要があります。
ステップ 4: テスト プログラム
コマンドターミナルに次のコマンドを入力すると、「Hello Jersey」が表示されます。
curl http://host:port/services/hello
または、ブラウザに次の URL を入力すると、「Hello Jersey」が表示されます
http://host:port/services /こんにちは
リソースを使用する
ルートリソースとサブリソース
リソースは、RESTful サービスの重要な部分であり、HTTP メソッド (GET、POST、PUT、DELETE など) を使用してリソースを操作できます。 JAX-RX では、リソースは POJO を通じて実装され、@Path アノテーションを使用して識別子を形成します。リソースには子リソースを含めることができます。親リソースはリソース コレクションであり、子リソースはメンバー リソースです。
次のサンプルコードでは、
Resourcesは「/services」URIで構成されるリソースのコレクションであり、UserResourceは「/services/user」URIで構成されるメンバーリソースです。
@Path("/services"); public class Resources { @Path("/user") public UserResource getUserResource() { ... } @Path("/book") public BookResource getBookResource() { ... }
}
UserResource は " で構成されています/user" URI コレクション リソース、getUser は "/user/{username}" URI で構成されるリソース メソッドです
@Path("/user")public class UserResource { @GET @Path("{username"}) @Produces ("application/ json") public User getUser(@PathParam("username") String userName) { ... }
}
HTTP メソッド
HTTP メソッドは CRUD (作成、読み取り、更新、削除) にマッピングされます。リソースの操作、基本モードは次のとおりです:
HTTP GET: 単一またはリソースのコレクションを読み取り/リスト/取得します。
HTTP POST : 新しいリソースを作成します。
HTTP PUT : 既存のリソースまたはリソース コレクションを更新します。
HTTP DELETE : リソースまたはリソース コレクションを削除します。注釈は、クライアントに返されるデータ識別タイプ (MIME) を指定するために使用されます。 @Produces は、クラス アノテーションまたはメソッド アノテーションとして使用できます。メソッドの @Produces アノテーションは、クラスのアノテーションをオーバーライドします。
MIME タイプを 1 つ指定します
@Produces("application/json")
複数の MIME タイプを指定します
@Produces({"application/json","application/xml"})
@Consumes
@Produces とは逆に、クライアントが送信できる MIME タイプを指定するために使用されます。一般に、複数の MIME タイプを指定することもできます。 @PUT 、 @POST に使用されます。
パラメータアノテーション
パラメータアノテーションは、クライアントによって送信されたデータを取得するために使用されます。この記事では、一般的に使用されるアノテーションのみを紹介します。詳細については、Jersey ユーザー マニュアルを参照してください。
@PathParam
@PathParam を使用して、次のように URI で指定されたルールのパラメーターを取得します。
@GET@Path("{username "})@Produces( MediaType.APPLICATION_JSON)public User getUser(@PathParam("username") String userName) {
...}
ブラウザが http://localhost/user/jack をリクエストすると、userName値はジャックです。
@QueryParam
@QueryParam GET リクエストでクエリ パラメータを取得するために使用されます。次のようなものです。
@GET@Path("/user")@Produces("text/plain")public User getUser(@QueryParam( "name ")") 文字列名、@QueryParam ("Age") int Age {
...}
ブラウザが http:/host: port/user? Name =rose & agge = 25 をリクエストすると、名前の値は Rose 、年齢の値は 25 です。パラメーターのデフォルト値を設定する必要がある場合は、次のように @DefaultValue を使用できます:
@GET@Path("/user")@Produces("text/plain")public User getUser(@QueryParam(") name") 文字列名、@DefaultValue("26") @QueryParam("age") int age) {
}
ブラウザが http://host:port/user?name=rose をリクエストしたとき、名前の値は Rose 、年齢の値は 26 です。
@FormParam
@FormParam は、名前が示すように、POST リクエストのフォーム パラメーターからデータを取得します。例:
@POST@Consumes("application/x-www-form-urlencoded") public void post(@FormParam("name") String name) { // メッセージを保存する}
@BeanParam
たとえば、リクエスト パラメータが多数ある場合、クライアントはユーザーを変更するために PUT リクエストを送信し、そのリクエストには多くのユーザー情報が含まれます。現時点では @BeanParam を使用できます。
@POST@Consumes("application/x-www-form-urlencoded")public void update(@BeanParam User user) { // ユーザーデータを格納する}
User Bean は次のように定義されます:
@XmlRootElement (name = "user")
public class User { @PathParam("userName) private String userName; @FormParam("name") private String name; @FormParam("telephone") private String Telephone; @FormParam("email" ) private String email; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName } ...
}
パラメータは変更可能ですが、上記のメソッドによりパラメータ構造の調整で問題が発生します。現時点では、次のように @Context アノテーションを使用して UriInfo インスタンスを取得することを検討できます:
@GET
public String get(@Context UriInfo ui) { MultivaluedMap
MultivaluedMap
}
は @Context アノテーション ServletConfig 、 ServletContext 、 HttpServlet からも取得できますリクエスト、 HttpServletResponse および HttpHeaders など:
@Path("/")public class Resource { @Context ServletConfig servletConfig; @GET public String get(@Context HttpHeaders hh) Map
JAX-RS は JAXB の使用をサポートしますXML バインディング用の Java API) JavaBeans は XML または JSON にバインドされ、その逆も同様です。 JavaBean には @XmlRootElement のアノテーションを付ける必要があります。@XmlElement アノテーションのないフィールドには、次のように同じ名前の XML 要素が含まれます。 public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getErrorMsg(String errorMsg) { this.errorMsg; }
}
}
public APIApplication() { //Load Model register(OptionResult.class) ; //Load Model OptionResult と同じパッケージを使用 //packages(OptionResult.class.getPackage().getName()); //Load Resource register(UserResource.class); //データ コンバーター register(JacksonJsonProvider.class ; 詳細については、Jersey を参照してください)ユーザーマニュアル
問題の概要
Ajaxリクエスト(POST、PUT、DELETE)がJerseyコンテナにデータを送信できない
問題の説明
SMS プラットフォームの開発では、データの CRUD はすべて Ajax テクノロジーを使用して完了するため、POST、PUT、および DELETE リクエストを使用する必要があります。これら 3 つのリクエストの content-type は「application/x-www-form-urlencoded」です。UTF-8 エンコードが使用されている場合は、「application/x-www-form-urlencoded; UTF-8」になります。 Firefox の tamperdata 拡張機能を使用してプログラムをデバッグする過程で、content-type が「application/x-www-form-urlencoded」の場合、Jersey コンテナは @FormParam アノテーションを通じて送信されたデータを取得できることが判明しました。 content-type が「application/x-www-form-urlencoded; UTF-8」の場合は取得できません。
解決策
最後に、Java FilterとJersey RequestFilterを使用して問題を解決しました。まず、Java フィルタで UTF8 を使用してリクエスト内のデータをエンコードし、次に Jersey RequestFilter でリクエスト オブジェクトのコンテンツ タイプを「application/x-www-form-urlencoded」に変更します。例:
public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request;
}public class RequestFilterimplements ContainerRequestFilter { @ Override public void filter(ContainerRequestContext context) throws IOException { String headerString = context.getHeaderString("content-type"); if (headerString != null) { //content-type が "application/x-www-form-" の場合urlencoded" " を実行し、 if (headerString.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) context.getHeaders().putSingle("content-type", MediaType.APPLICATION_FORM_URLENCODED) } }
}
最後に web.xml に Java を登録します。フィルター (Jersey コンテナーの前に登録される) では、次のように APIApplication に Jersey RequestFilter を登録します:
public class APIApplication extends ResourceConfig {
public APIApplication() {
register(RequestFilter.class);
}
}
手順
: この問題を修正した後、Github の Jersey ソース コード リポジトリで、誰かがこの問題を発見して修正したことがわかりました。詳細については、このディスカッション
を参照してください。Java Jersey2 の使い方まとめに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。