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. 客户会决定他们想知道有关特定地点的一些信息,因此他们会要求服务搜索该地点并告诉他们到该地点的链接,或者至少是与搜索条件匹配的地点;因为这可能是几个不同的地方(想想“伦敦,英国”与“安大略省伦敦”以响应对“伦敦”的搜索),结果将是一个链接到每个地方的特征的页面。它也可能会说明每个链接的含义,但这不是必需的。(结果的格式可以是 HTML、XML、JSON 或多种不同格式中的任何一种;HTTP 内容协商是在它们之间进行选择的好方法。)
  2. 一旦用户从列表中确定了他们真正想要的信息的地点,他们就会点击链接并获得关于该地点的哪些信息可用的描述。该文档提供指向提供最高温度的页面、提供最低温度的另一个页面以及提供湿度的第三个页面的链接。
  3. 要获取实际数据,需要遵循另一个链接并提供该数据。由于数据是一个简单的浮点数,因此将其作为纯文本返回是非常合理的。

现在,我们需要将这些东西映射到 URL:

  1. 搜索:(/search?place=somename很容易与地名挂钩),其中包含指向...的链接</li>
  2. 地点:(/place/{id}哪里{id}是一些通用 ID,它可能是您的数据库的主键;由于名称重复的问题,我们不想在此处使用该名称),其中包含指向...的链接。</li>
  3. 数据:/place/{id}/maxTemp, /place/{id}/minTemp, /place/{id}/humidity.

我们还需要有一些方法来创建文档。推荐使用JAXB 。链接可能应该在 XML 中完成,属性名为xlink:href; 使用(通过引用)这样的 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.
}

正如你所看到的,它可以继续下去,但只要你从一个好的计划开始,一切都意味着什么,这并不难……</p>

于 2012-10-04T14:03:49.533 回答
3

谢天谢地,Donal Fellows 指出了 @WebService 注释。直到他意识到这是一项网络服务,我才意识到。

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

最好在 finally 块中关闭您的资源,包裹在单独的 try/catch 块中。

那些空的 catch 块会让你发疯。坏事会发生,但你永远不会知道。

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

REST 要求客户端做所有相同的事情,除了不是将请求参数打包成 XML 请求,而是通过 HTTP 发送。该 API 是 HTTP GET、POST、DELETE。您将方法调用表示为 URI。

因此,您需要对您的 SOAP API 有很好的了解并需要一些头脑。我不知道有什么工具可以为你做这件事。

于 2012-10-04T10:30:49.420 回答