Web services 将SOAP转换为REST

Web services 将SOAP转换为REST,web-services,rest,soap,middleware,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:

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

谢天谢地,多纳尔·费罗斯指出了@WebService注释。直到他意识到,我才意识到这是一个web服务

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

最好在finally块中关闭您的资源,将其包装在单个try/catch块中

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

SOAP客户机通过HTTP向服务发送XML请求,该服务解析XML请求,将值绑定到输入,使用它们来完成用例,并将响应封送为XML发送回

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


因此,您需要充分了解SOAP API和一些头脑。我不知道有什么工具可以为您做这件事。

REST是一种完全不同的方式,可以将web服务看作SOAP。特别是,它在资源、它们的表示和它们之间的联系方面运作。(您也有关于的HTTP谓词,但对于像这样的简单查询服务,您可能只会使用GET。)

该接口的RESTful版本的工作原理如下:

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

  • 搜索:
    /search?place=somename
    (很容易在地名后面连接),其中包含指向
  • 地点:
    /Place/{id}
    (其中
    {id}
    是一些通用id,可能是数据库的主键;由于名称重复问题,我们不希望在此处使用该名称),其中包含指向
  • 数据:
    /place/{id}/maxTemp
    /place/{id}/minTemp
    /place/{id}/湿度
  • 我们还需要一些方法来创建文档。建议使用JAXB。链接可能应该在XML中完成,属性名为
    xlink:href
    ;使用(通过引用)这样的XLink规范确切地说明了属性的内容是链接(由于其一般性质,该属性的明确声明在XML中是一个真正的问题)

    最后,您可能希望使用JAX-RS将Java代码绑定到服务。这比你自己写要容易得多。这让您可以着手做类似的事情(为了简洁起见,省去了数据绑定类):


    正如你所看到的,它可以持续一段时间,但只要你从一个好的计划开始,就不难做到……我同意。我不认为有一个工具可以转换这个java代码中隐含的修饰内容。最好的办法是将SOAP细节抽象到一个单独的层中,并处理该接口的JSON实现。看起来像是一个非常简单的SOAP对象(类上有一个
    @WebService
    注释),在如何进行SOAP映射方面有默认值。为什么要将
    connectDB()
    放在SOAP接口中?这是一种真正不属于那里的方法-1,不了解您正在尝试做什么或面临什么问题。E膜服务代理()。
    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.
    }