Web services 将SOAP转换为REST
如何使用java语言将SOAP转换为RESTWeb 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:
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版本的工作原理如下:
/search?place=somename
(很容易在地名后面连接),其中包含指向/Place/{id}
(其中{id}
是一些通用id,可能是数据库的主键;由于名称重复问题,我们不希望在此处使用该名称),其中包含指向/place/{id}/maxTemp
,/place/{id}/minTemp
,/place/{id}/湿度
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.
}