将SOAP转换为REST

时间:2012-10-04 10:27:32

标签: web-services rest soap middleware

如何使用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;
  }
 }

2 个答案:

答案 0 :(得分:4)

REST是一种将Web服务视为SOAP的完全不同的方式。特别是,它在资源,它们的表示和它们之间的链接方面运行。 (你也有关于HTTP的动词,但对于像这样的简单查询服务,你可能只会使用GET。)

该界面的RESTful版本有点像这样:

  1. 客户会决定他们想要了解某个地方的某些信息,因此他们会要求该服务搜索该地点并告诉他们与该地点的链接,或至少告诉他们符合搜索条件的地方;因为这可能是几个不同的地方(想想“伦敦,英国”与“伦敦,安东尼”,以回应搜索“伦敦”),结果将是一个链接到每个地方的特征描述的页面。它也可能会说明每个链接的含义,但这不是必需的。 (结果的格式可以是HTML,XML或JSON,也可以是多种不同格式中的任何一种; HTTP内容协商是在它们之间进行选择的好方法。)
  2. 一旦用户确定了实际上想要了解相关信息的列表中的哪个位置,他们就会按照该链接获取有关该地点可用信息的说明。这是一个文档,提供指向提供最高温度的页面的链接,提供最低温度的另一个页面,以及提供湿度的第三个页面。
  3. 要获取实际数据,请遵循另一个链接并提供该数据。由于数据是一个简单的浮点数,因此将其作为纯文本返回是非常合理的。
  4. 现在,我们需要将这些内容映射到网址:

    1. 搜索:/search?place=somename(很容易在地名后面挂钩),其中包含指向...的链接。
    2. 放置:/place/{id}(其中{id}是一些通用ID,可能是您的数据库的主键;我们不想在此使用此名称,因为名称有重复问题),其中包含链接为...
    3. 数据:/place/{id}/maxTemp/place/{id}/minTemp/place/{id}/humidity
    4. 我们还需要有一些方法来创建文档。 JAXB 推荐。链接应该使用名为xlink:href的属性在XML中完成;使用(通过引用)XLink规范就像确切地说明属性的内容是一个链接(由于其一般性质,其中的明确声明在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.
      }
      

      正如你所看到的,它可以继续下去,但只要你从一个好的计划开始,一切都意味着它就不难做到......

答案 1 :(得分:3)

谢天谢地,Donal Fellows指出了@WebService注释。在他做之前我没有意识到这是一个Web服务。

使用此实现时,您将遇到更多API选择问题。如果您在Java EE应用服务器上进行部署,我建议使用JNDI数据源和连接池而不是硬连线数据库参数,并为每个请求进行连接。

最好关闭finally块中的资源,包含在各个try / catch块中。

那些空的挡块会让你发疯。糟糕的事情会发生,但你永远不会知道。

SOAP客户端通过HTTP将XML请求发送到解析它的服务,将值绑定到输入,使用它们来完成用例,并将响应编组为XML以便发回。

REST要求客户端执行所有相同的操作,除了将请求参数打包到通过HTTP发送的XML请求中。 API是HTTP GET,POST,DELETE。您将方法调用表示为URI。

因此,您需要熟悉您的SOAP API以及您的一些大脑。我不知道为你做任何工具。