スキーマのない Java REST クライアント
質問
ゴール
Yahoo の HotJobs 用の Java クライアント 履歴書検索REST API.
背景
私は SOAP API 用の Web サービス クライアントを作成することに慣れています。 wsimport プロキシ スタブを生成すると、すぐに実行できるようになります。しかし、これは REST API であり、私にとっては初めてのことです。
詳細
- 休む API
- いいえ WADL
- 正式な XML スキーマ (XSD または DTD ファイル) はありません。がある XML リクエスト/レスポンス ペアの例.
- サンプルコードは提供されていません
進捗
質問を見ました Java 用の REST クライアント?, ただし、自動化されたソリューションでは、サーバーとクライアントの両方を提供し、POJO で呼び出される JAXB を使用してスキーマと REST API を生成することを前提としています。
使用する ジャージー ( JAX-RS 実装)、手動で HTTP リクエストを行うことができました。
import com.sun.jersey.api.client.*;
...
ClientConfig clientConfig = new DefaultClientConfig();
Client client = Client.create(clientConfig);
WebResource webResource = client.resource("https://hj.yahooapis.com/v1/HJAuthTokens");
webResource.accept("application/xml");
// body is a hard-coded string, with replacements for the variable bits
String response = webResource.post(String.class, body);
// parse response into a org.w3c.dom.Document
// interface with Document via XPATH, or write my own POJO mappings
応答は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<Response>
<ResponseCode>0</ResponseCode>
<ResponseMessage>Login successful</ResponseMessage>
<Token>NTlEMTdFNjk3Qjg4NUJBNDA3MkJFOTI3NzJEMTdDNDU7bG9jYWxob3N0LmVnbGJwLmNvcnAueWFob28uY29tO0pVNWpzRGRhN3VhSS4yQVRqRi4wWE5jTWl0RHVVYzQyX3luYWd1TjIxaGx6U0lhTXN3LS07NjY2MzM1OzIzNDY3NTsxMjA5MDE2OTE5OzZCM1RBMVNudHdLbl9VdFFKMFEydWctLQ==</Token>
</Response>
または、次のようにすることもできます。
<?xml version="1.0" encoding="utf-8"?>
<yahoo:error xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" xml:lang="en-US">
<yahoo:description>description</yahoo:description>
<yahoo:detail>
<ErrorCode>errorCode</ErrorCode>
</yahoo:detail>
</yahoo:error>
質問
解決
これは、彼らは、スキーマの名前空間URIとHTTPのURLを提供していますが、実際にそこに自分のスキーマを保存しないことは興味深いです。これは、電子メールまたはディスカッションリストの投稿を修正することができ、その部分の見落としである可能性があります。
一つのアプローチは、独自のスキーマを作成することですが、これは少しのリターンのために多くの作業のように思えます。あなたも、それらをラップするPOJOが必要な場合は、メッセージがどのように単純で考えると、私は疑問に思いますか?なぜあなたは、XPathを使用して必要なデータを抽出し、ハンドラを持っていませんか?
<時間>編集:過去からの爆風が、私は質問を再読み込み、コメントを見て、最初の文を理解するのは難しいことに気づきました。だから、明確ます:
1つの非常に良い習慣を、あなたは公的にアクセス可能なWebサービスを記述するつもりなら、あなたは、スキーマの名前空間URIに使用するのと同じURLでごスキーマ文書を利用できるようにすることです - 以上、URLがあることを持っていますドキュメントを完了するために、リンク(W3C XSD名前空間自体が良い例です: http://www.w3.org / 2001 / XMLスキーマで)ます。
他のヒント
私は手で豆を書いて、あなたがする必要がある場合にのみJAXB注釈で注釈を付けることをお勧め。ほとんどのアクセサ/ミューテーター(ゲッター/セッター)のためにあなたがする必要はありません。デフォルトでは、すべての公共豆のアクセサとフィールドは、名前が豆規則を使用して導出された、と考えられており、デフォルトでは、要素の代わりに属性(属性が注釈される必要があるので)を使用することですされます。
は、別の方法としては、手でコースの書き込みスキーマの、あなたの場合はW3C Schemaの多くのように、JAXBを使用した豆を生成することができます。そして、ちょうどデータを結合するために結果のコードではなく、スキーマを使用します。
POJOのよう:それは非常にシンプルにすることができます。ような何かます:
@XmlRootElement("Response")
class Response {
public int responseCode;
public String responseMessage;
public String token; // or perhaps byte[] works for automated base64?
}
と同様に他のもののために。または、利用ゲッター/セッターあなたがそれらを好きで、もう少し冗長性を気にしない。場合これらは、あまりにも空想を取得する必要単なるデータコンテナません。
そして、あなたは内容からタイプを自動検出しなければならない場合、そのルート要素を指すにXMLStreamReaderを手渡し、どのようなルート要素を参照して、JAXBたUnmarshallerを使用してバインドするスタックスパーサーを使用することを検討してください。そうすれば、あなたはにバインドする別のオブジェクト型を渡すことができます。
そして最後に:リクエストを受信/送信:昔ながらのHttpURLConnectionがGETとPOSTリクエスト(、たとえば、使用して構築URL.openConnection())のために[OK]を動作します。必要であれば、ジャカルタのHttpClientは、より多くの機能を備えています。だから、多くの場合、あなたは本当に別のRESTクライアントを必要としない - 彼らは便利になるが、一般的に、単純なHTTPクライアント片の上に構築することができる。
。私はHTTP4E REST呼び出しを行うために非常に便利。これは、HTTPハッキング、改ざん、それはHTTPのデバッグの偉大な仕事をしていません...それは、タブ、構文の色分け、自動提案、コード生成、REST HTTP呼び出しリプレイなどを持って、素晴らしいEclipseのプラグインです。私はそれをとても楽しんでいます。
(私は開発者です) jcabi-HTTP のからJdkRequest
をお試しください。これは、それがどのように動作するかです。
String body = new JdkRequest("http://www.google.com")
.header("User-Agent", "it's me")
.fetch()
.body()
詳細については、このブログの記事をチェックしてください:ます。http:// www.yegor256.com/2014/04/11/jcabi-http-intro.htmlする