10

ゴール

Yahoo の HotJobs Resume Search REST APIの Java クライアント。

バックグラウンド

私は、SOAP API 用の Web サービス クライアントを作成することに慣れています。そこでは、wsimportがプロキシ スタブを生成し、オフにして実行しています。しかし、これは私にとって新しい REST API です。

詳細

進捗

質問Rest clients for Javaを見ましたか? 、しかし、そこにある自動化されたソリューションは、スキーマと REST API を生成するために POJO で呼び出された JAXB を使用して、サーバーとクライアントの両方を提供していることを前提としています。

Jersey ( 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>  

質問

  • 正式なスキーマなしでマーシャリング/アンマーシャリングできるPOJOを自動生成する方法はありますか?
  • JAXBアノテーションを使用して、これらの POJO を手動で生成しようとする必要がありますか?
  • これをすべて手動で行う必要がないように、活用すべきツールはありますか?
4

4 に答える 4

3

Beanを手動で作成し、必要な場合にのみJAXBアノテーションを付けることをお勧めします。ほとんどのアクセサー/ミューテーター(ゲッター/セッター)の場合、そうする必要はありません。デフォルトでは、すべてのパブリックBeanアクセサーとフィールドが考慮され、名前はBean規則を使用して派生し、デフォルトでは属性の代わりに要素を使用します(したがって、属性に注釈を付ける必要があります)。

あるいは、W3Cスキーマが大好きな場合は、もちろん手動でスキーマを記述し、JAXBを使用してBeanを生成することもできます。また、データバインディングには、スキーマではなく、結果のコードを使用します。

POJOに関して:それは非常に簡単です。何かのようなもの:

@XmlRootElement("Response")
class Response {
  public int responseCode;
  public String responseMessage;
  public String token; // or perhaps byte[] works for automated base64?
}

他のものも同様です。または、ゲッター/セッターが好きで、もう少し冗長性を気にしない場合は、ゲッター/セッターを使用します。これらは単なるデータコンテナであり、あまり凝ったものにする必要はありません。

また、コンテンツからタイプを自動検出する必要がある場合は、Staxパーサーを使用してルート要素を確認してから、JAXB Unmarshallerを使用してバインドし、そのルート要素を指すXMLStreamReaderを渡すことを検討してください。そうすれば、バインドするさまざまなオブジェクトタイプを渡すことができます。

そして最後に:リクエストの送受信:プレーンな古いHttpURLConnectionはGETおよびPOSTリクエストに対して問題なく機能します(たとえば、URL.openConnection()を使用して構築します)。Jakarta HttpClientには、必要に応じてより多くの機能があります。そのため、多くの場合、個別のRESTクライアントは実際には必要ありません。これらは便利な場合がありますが、通常は単純なhttpクライアントの部分に基づいて構築されます。

于 2009-02-28T00:59:01.767 に答える
3

興味深いことに、スキーマの名前空間 URI として HTTP URL を提供していますが、実際にはそこにスキーマを保存していません。それは彼らの側の見落としである可能性があり、電子メールまたはディスカッションリストへの投稿によって修正される可能性があります.

1 つのアプローチは、独自のスキーマを作成することですが、これは多くの作業を行ってほとんど利益を得ないように思えます。メッセージがどれほど単純かを考えると、メッセージをラップするために POJO が必要なのだろうか? XPath を使用して必要なデータを抽出するハンドラーを用意しないのはなぜでしょうか?


編集:過去から爆破しましたが、コメントを見て、質問を読み直して、最初の文が理解しにくいことに気付きました。したがって、明確化:

一般にアクセス可能な Web サービスを作成する場合の非常に良い習慣の 1 つは、スキーマの名前空間 URI に使用するのと同じ URL でスキーマ ドキュメントを利用できるようにすることです。ドキュメント (W3C XSD 名前空間自体が良い例です: http://www.w3.org/2001/XMLSchema )。

于 2008-12-11T15:32:02.270 に答える
1

HTTP4E は、REST 呼び出しを行うのに非常に便利です。これはすばらしい Eclipse プラグインであり、タブ、構文の色分け、自動提案、コード生成、REST HTTP 呼び出しの再生などを備えています。HTTP デバッグ、HTTP 改ざん、ハッキングの素晴らしい仕事をします。私はそれをとても楽しんでいます。

http://www.ywebb.com/

于 2009-06-15T00:49:36.830 に答える
0

jcabi-httpJdkRequestから試してください(私は開発者です)。これがどのように機能するかです:

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

于 2014-06-29T08:14:25.013 に答える