3

Java言語を使用してSOAPをRESTに変換する方法は?

package net.weather;
import java.sql.*;
import javax.jws.WebService;
@WebService
public class ProjectFinalWS{
Connection con;
Statement st;
ResultSet rs;
String res;
public void connectDB()
     {
      String url ="jdbc:mysql://localhost:3306/";
      String dbName ="project";
      String driver = "com.mysql.jdbc.Driver";
      String userName = "root"; 
      String password = "root";
      try
      {
      Class.forName(driver).newInstance();
      con = DriverManager.getConnection(url+dbName,userName,password);

      }catch(Exception e){}
     }
public float getMaxTemp(String city)
{     float mxtemp=0;
      connectDB();
      try{
      st=con.createStatement();
      rs=st.executeQuery("select  maxtemp from weather where city='"+city+"'");
      rs.next();
      mxtemp=rs.getFloat(1);
      st.close();
      con.close();
      }
      catch(Exception e){}

return mxtemp;
  }
public float getMinTemp(String city)
{     float mntemp=0;
      connectDB();
      try{
      st=con.createStatement();
      rs=st.executeQuery("select  mintemp from weather where city='"+city+"'");
      rs.next();
      mntemp=rs.getFloat(1);
      st.close();
      con.close();
      }
      catch(Exception e){}

return mntemp;
  }
public float getHumidity(String city)
{     float humidity=0;
      connectDB();
      try{
      st=con.createStatement();
      rs=st.executeQuery("select  humidity from weather where        

         city='"+city+"'");
      rs.next();
      humidity=rs.getFloat(1);
      st.close();
      con.close();
      }
      catch(Exception e){}

return humidity;
  }
 }
4

2 に答える 2

5

REST は、SOAP とはまったく異なる Web サービスの考え方です。特に、リソース、その表現、およびそれらの間のリンクに関して機能します。(HTTP 動詞もありますが、このような単純なクエリ サービスの場合は、とにかく GET しか使用しないでしょう。)

そのインターフェイスの RESTful バージョンは、次のように少し動作します。

  1. クライアントは、特定の場所に関する情報を知りたいと判断し、サービスにその場所を検索して、その場所へのリンク、または少なくとも検索条件に一致する場所へのリンクを伝えるように依頼します。それはいくつかの異なる場所である可能性があるため ("London" の検索に対する "London, UK" と "London, Ont." を考えてみてください) の結果は、それぞれの場所の特徴にリンクするページになります。また、各リンクが何を意味するかについても少し述べているかもしれませんが、それは必須ではありません。(結果の形式は、HTML、XML、JSON、または多数の異なる形式のいずれかです。HTTP コンテンツ ネゴシエーションは、それらの中から選択する優れた方法です。)
  2. ユーザーがリストから実際に情報が必要な場所を決定したら、リンクをたどって、その場所に関するどのような情報が利用可能かについての説明を取得します。これは、最高温度を提供するページ、最低温度を提供する別のページ、および湿度を提供する 3 番目のページへのリンクを提供するドキュメントです。
  3. 実際のデータを取得するには、別のリンクをたどると、そのデータが提供されます。データは単純なフロートであるため、プレーン テキストとして戻すことは非常に合理的です。

次に、これらのものを URL にマップする必要があります。

  1. 検索: /search?place=somename(場所の名前の後ろに接続するのは簡単です), へのリンクが含まれています.</li>
  2. 場所: /place/{id}( {id}DB の主キーであると思われる一般的な ID です。重複する名前の問題があるため、ここでは名前を使用しません)。
  3. データ: /place/{id}/maxTemp, /place/{id}/minTemp, /place/{id}/humidity.

また、ドキュメントを作成する方法も必要です。JAXB をお勧めします。リンクは、おそらく と呼ばれる属性を使用して XML で行う必要がありますxlink:href。属性のコンテンツがリンクであることを正確に述べているような XLink 仕様を (参照により) 使用する (それ以外の場合、XML の一般的な性質のために、その明確なステートメントは XML の実際の問題です)。

最後に、JAX-RS を使用して、Java コードをサービスにバインドすることをお勧めします。これは、すべてを自分で書くよりもはるかに簡単です。これにより、次のようなことを行うことができます (簡潔にするために、データ バインディング クラスは省略します)。

public class MyRestWeatherService {
    @GET
    @Path("/search")
    @Produces("application/xml")
    public SearchResults search(@QueryParam("place") String placeName) {
        // ...
    }

    @GET
    @Path("/place/{id}")
    @Produces("application/xml")
    public PlaceDescription place(@PathParam("id") String placeId) {
        // ...
    }

    @GET
    @Path("/place/{id}/maxTemp")
    @Produces("text/plain")
    public String getMaxTemperature(@PathParam("id") String placeId) {
        // ...
    }
    // etc.
}

ご覧のとおり、少し長くなる可能性がありますが、すべてが何を意味するかについて適切な計画を立てて開始する限り、実行するのは難しくありません…</p>

于 2012-10-04T14:03:49.533 に答える
3

@WebService アノテーションを指摘してくれた Donal Fellows に感謝します。彼が知るまで、私はこれが Web サービスであることを知りませんでした。

この実装では、API の選択よりも多くの問題が発生します。Java EE アプリケーション サーバーにデプロイする場合は、ハードワイヤード データベース パラメータの代わりに JNDI データ ソースと接続プールを使用し、リクエストごとに接続することをお勧めします。

個々の try/catch ブロックでラップされた、finally ブロックでリソースを閉じることをお勧めします。

それらの空の catch ブロックはあなたを夢中にさせます。悪いことが起こりますが、あなたは決して知りません。

SOAP クライアントは、HTTP を介して XML 要求をサービスに送信します。サービスはそれを解析し、値を入力にバインドし、それらを使用してユース ケースを満たし、応答を XML としてマーシャリングして送り返します。

REST は、要求パラメーターを HTTP 経由で送信される XML 要求にパッケージ化する代わりに、クライアントにすべて同じことを行うように要求します。API は HTTP GET、POST、DELETE です。メソッド呼び出しを URI として表現します。

そのため、SOAP API に関する十分な知識と、ある程度の頭脳が必要になります。私はあなたのためにそれを行うためのツールを知りません。

于 2012-10-04T10:30:49.420 に答える