webService开发笔记
- 格式:docx
- 大小:158.49 KB
- 文档页数:5
Java中webserivce学习纪要一、java中webserivce的分派1,xFireXFire是新一代的Java Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举。
和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地和Spring 集成,它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。
XFire是codeHaus组织提供的一个开源框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,这种处理方式不仅充分发挥了POJO的作用,简化了Java应用转化为Web服务的步骤和过程,也直接降低了SOA的实现难度,为企业转向SOA架构提供了一种简单可行的方式。
XFire目前还在使用的最重要的原因是对jdk的要求很低,可以运行在任意版本的jdk 之上,XFire的工作原理是基于接口的调用XFire进一步发展之后成为CXF,CXF是apache目前的主推产品2,AXISaxis全称Apache EXtensible Interaction System 即阿帕奇可扩展交互系统。
Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。
Axis目前版本是为Java编写的,不过为C++的版本正在开发中。
但Axis并不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎(例如Tomcat)的服务器。
Axis目前最新的版本是Axis23,JAX-RPC通过使用JAX-RPC(Java API for XML-based RPC),已有的Java类或Java应用都能够被重新包装,并以Web Services的形式发布。
JAX-RPC提供了将RPC参数(in/out)编码和解码的API,使开发人员可以方便地使用SOAP消息来完成RPC调用。
同样,对于那些使用EJB(Enterprise JavaBeans)的商业应用而言,同样可以使用JAX-RPC来包装成Web服务,而这个Web Service的WSDL界面是与原先的EJB的方法是对应一致的。
1、WebService调用方法:在reference处右击然后再选择“Add Service reference”,(呵呵,地球人都知道),关键是代码处怎么调用,如果当前项目是Web Application或web site,则调用代码为创建的“Service名字.Service里面的类名”,如:ServiceReference2.WebService1 service = new ServiceReference2.WebService1();service.HelloWorld();如果当前项目是App Application中ClassLibrary,则调用代码为创建的“Service名字.Service里面类的SoapClient类名”(注:SoapClient类是你在添加Web引用时,当前项目自动为你生成的),代码举例如下:ServiceReference2.WebService1SoapClient service =new ServiceReference2.WebService1SoapClient ();service .HelloWorld();2、Web Service相关配置问题,当我们在引用WebService时,系统会自己为我们生成相关配置信息,如web Service的url,通信协议格式,但需要注意的,如果我们引用WebService的项目是一个ClassLibrary项目,则我们需要在将ClassLibrary项目的app.config的system.serviceModel节内容,复制到调用ClassLibrary项目的App Application 或Web Application项目的配置文件中,否则运行时会报找不到“endpoint”节错误,这实际上跟数据库连接配置的原理是一样的。
数据访问层在程序发布时,只会去读取整个运行项目的.config文件,不会再读取数据访问层项目的config文件。
WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单关键字: webservice cxf soaWebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web 系统,这样的业务需求自然需要通过WebService进行信息数据的操作。
下面就将我们在开发中摸索的一点经验教训总结以下,以供大家参考.在WebService开发笔记 2 -- VS 2005 访问WebServcie更简单中作一个跨平台访问WebServcie服务的例子....在WebService开发笔记 3 -- 增强访问 WebService 的安全性通过一个简单的用户口令验证机制来加强一下WebService的安全性....我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate;1.首先集成Apacha CXF WebService 到 Spring 框架中;apache cxf 下载地址:/dist/incubator/cxf/2.0.4-incubator/apache -cxf-2.0.4-incubator.zip在spring context配置文件中引入以下cxf配置Xml代码1.<import resource="classpath*:META-INF/cxf/cxf.xml"/>2.<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml"/>3.<import resource="classpath*:META-INF/cxf/cxf-servlet.xml"/>在web.xml中添加过滤器:Xml代码1.<servlet>2.<servlet-name>CXFServlet</servlet-name>3.<servlet-class>4. org.apache.cxf.transport.servlet.CXFServlet5.</servlet-class>6.</servlet>7.<servlet-mapping>8.<servlet-name>CXFServlet</servlet-name>9.<url-pattern>/services/*</url-pattern>10.</servlet-mapping>2.开发服务端WebService接口:Java代码1./**2. * WebService接口定义类.3. *4. * 使用@WebService将接口中的所有方法输出为Web Service.5. * 可用annotation对设置方法、参数和返回值在WSDL中的定义.6. */7.@WebService8.public interface WebServiceSample {9.10.11. /**12. * 一个简单的方法,返回一个字符串13. * @param hello14. * @return15. */16. String say(String hello);17.18. /**19. * 稍微复杂一些的方法,传递一个对象给服务端处理20. * @param user21. * @return22. */23. String sayUserName(24. @WebParam(name = "user")25. UserDTO user);26.27. /**28. * 最复杂的方法,返回一个List封装的对象集合29. * @return30. */31. public32. @WebResult(partName="o")33. ListObject findUsers();34.35.}由简单到复杂定义了三个接口,模拟业务需求;3.实现接口Java代码1./**2. * WebService实现类.3. *4. * 使用@WebService指向Interface定义类即可.5. */6.@WebService(endpointInterface = ".examples.webservice.WebServiceSample")7.public class WebServiceSampleImpl implements WebServiceSample {8.9. public String sayUserName(UserDTO user) {10. return "hello "+user.getName();11. }12.13. public String say(String hello) {14. return "hello "+hello;15. }16.17. public ListObject findUsers() {18. ArrayList<Object> list = new ArrayList<Object>();19.20. list.add(instancUser(1,"lib"));21. list.add(instancUser(2,"mld"));22. list.add(instancUser(3,"lq"));23. list.add(instancUser(4,"gj"));24. ListObject o = new ListObject();25. o.setList(list);26. return o;27. }28.29. private UserDTO instancUser(Integer id,String name){30. UserDTO user = new UserDTO();31. user.setId(id);32. user.setName(name);33. return user;34. }35.}4.依赖的两个类:用户对象与List对象Java代码1./**2. * Web Service传输User信息的DTO.3. *4. * 分离entity类与web service接口间的耦合,隔绝entity类的修改对接口的影响.5. * 使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定.6. *7. */8.@XmlAccessorType(XmlAccessType.FIELD)9.@XmlType(name = "User")10.public class UserDTO {11.12. protected Integer id;13.14. protected String name;15.16. public Integer getId() {17. return id;18. }19.20. public void setId(Integer value) {21. id = value;22. }23.24. public String getName() {25. return name;26. }27.28. public void setName(String value) {29. name = value;30. }31.}关于List对象,参照了有关JWS的一个问题中的描述:DK6.0 自带的WebService 中 WebMethod的参数好像不能是ArrayList 或者其他List传递List需要将List 包装在其他对象内部才行 (个人理解如有不对请指出) ,我在实践中也遇到了此类问题.通过以下封装的对象即可以传递List对象.Java代码1./**2. * <p>Java class for listObject complex type.3. *4. * <p>The following schema fragment specifies the expected content contained within this class.5. *6. * <pre>7. * <complexType name="listObject">8. * <complexContent>9. * <restriction base="{/2001/XMLSchema}anyType">10. * <sequence>11. * <element name="list" type="{/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>12. * </sequence>13. * </restriction>14. * </complexContent>15. * </complexType>16. * </pre>17. *18. *19. */20.@XmlAccessorType(XmlAccessType.FIELD)21.@XmlType(name = "listObject", propOrder = { "list" })22.public class ListObject {23.24. @XmlElement(nillable = true)25. protected List<Object> list;26.27. /**28. * Gets the value of the list property.29. *30. * <p>31. * This accessor method returns a reference to the live list,32. * not a snapshot. Therefore any modification you make to the33. * returned list will be present inside the JAXB object.34. * This is why there is not a <CODE>set</CODE> method for the list property.35. *36. * <p>37. * For example, to add a new item, do as follows:38. * <pre>39. * getList().add(newItem);40. * </pre>41. *42. *43. * <p>44. * Objects of the following type(s) are allowed in the list45. * {@link Object }46. *47. *48. */49. public List<Object> getList() {50. if (list == null) {51. list = new ArrayList<Object>();52. }53. return this.list;54. }55.56. public void setList(ArrayList<Object> list) {57. this.list = list;58. }59.60.}5.WebService 服务端 spring 配置文件 ws-context.xmlXml代码1.<beans xmlns="/schema/beans"2.xmlns:xsi="http://www.w/2001/XMLSchema-instance"3.xmlns:jaxws="/jaxws"4.xsi:schemaLocation="/jaxws http://cxf./schemas/jaxws.xsd /sch ema/beans /schema/beans/spring-b eans.xsd"5.default-autowire="byName"default-lazy-init="true">6.7.<jaxws:endpoint id="webServiceSample"8.address="/WebServiceSample"implementor=".coral.biz.examples.webservice.WebServiceSampleImpl"/>9.10.</beans>WebService 客户端 spring 配置文件 wsclient-context.xmlXml代码1.<beans xmlns="/schema/beans"2.xmlns:xsi="http://www.w/2001/XMLSchema-instance"3.xmlns:jaxws="/jaxws"4.xsi:schemaLocation="/jaxws http://cxf./schemas/jaxws.xsd /sch ema/beans /schema/beans/spring-b eans.xsd"5.default-autowire="byName"default-lazy-init="true">6.7. <!-- ws client -->8.<bean id="identityValidateServiceClient"class=".coral.admin.service.IdentityValidateService"9.factory-bean="identityValidateServiceClientFactory"factory-method="create"/>10.11. <bean id="identityValidateServiceClientFactory"12. class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">13. <property name="serviceClass"14. value=".coral.admin.service.IdentityValidateService"/>15. <property name="address"16. value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>17. </bean>18.19.</beans>6.发布到tomcat服务器以后通过以下地址即可查看自定义的webservice接口生成的wsdl:http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl7.调用WebService接口的Junit单元测试程序Java代码1.package test.coral.sample;2.3.import org.springframework.test.AbstractDependencyInjectionSpringContextTests;4.5.import .examples.webservice.WebServiceSample;6.import erDTO;7.8.public class TestWebServiceSample extends9. AbstractDependencyInjectionSpringContextTests {10. WebServiceSample webServiceSampleClient;11.12. public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {13. this.webServiceSampleClient = webServiceSampleClient;14. }15.16. @Override17. protected String[] getConfigLocations() {18. setAutowireMode(AUTOWIRE_BY_NAME);19. //spring 客户端配置文件保存位置20. return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };21. }22.23. public void testWSClinet(){24. Assert.hasText(webServiceSampleClient.say(" world"));25. }26.}。
Web 服务概念Web服务建立于面向服务体系结构之上的,可以将软件组件(来自不同系统的应用函数,对象,)发布为服务Web服务基于专门使用XML的开发式标准和技术实现Web服务原因1.Web服务可以拆穿防火墙,通过基于XML的PRC机制调用2.Web服务提供基于XML消息交换的跨平台跨语言的解决方案3.Web服务可以使用轻量级结构简化应用系统集成,而不影响可伸缩性4.Web服务可以实现异源程序之间互操作Web服务基本模型服务提供方服务代理方服务请求方Web服务标准XML SOAP WSDL UDDIWeb服务面临的难题1.分布式事务2.服务质量3.安全性Web服务的优点1.提供简单的机制,使应用程序称为任何人可以随时随地通过任何设备访问的服务2.帮助实现企业内部,企业之间的通信3.Internate 中应用程序通行的灵活性,灵敏性4.可以通过代理动态定位和调用服务Web服务体系结构和技术Web服务体系结构概念1.SOAP 在服务提供方和服务请求方之间交换信息充当消息交换协议。
2.WSDL 是将web服务描述为操作集,并将输入输出描述为消息3.UDDI 一种通过注册表中注册Web服务并划分类别的机制Web服务通信模型1.基于PRC的通信模型基于PRC通信模型定义基于请求/响应得异步通信2.基于消息交换的通信模型基于消息交换的通信模型定义松散关联和文档驱动的通信。
调用基于消息交换的服务提供方的服务请求无需等待响应实现Web服务1.服务提供方创建基于SOAP服务的商业应用程序接口,发布到网络。
2.服务提供方使用服务代理基于WSDL服务描述,服务代理方通常是一个UDDI注册表3.UDDI注册表将服务描述存储为绑定的模版和到服务提供方环境的WSDL和URL 4.服务请求方通过UDDI注册表找到所需的服务和绑定的信息和URL找到服务提供方5.服务请求方使用绑定信息激活服务提供器检索已注册的WSDL服务描述,建立与SOAP 的服务间的通信。
webservice_rest接⼝_学习笔记1、声明WebClientUtil⼯具类public class WebClientUtil {public static String doPost(String url,Map<String, Object> params,String token,String contentType,int connectTimeout,int readTimeout,String dataType) throws Exception{System.out.println("调⽤:-" + url + "接⼝,参数列表:-" + params);String parameterData = null;OutputStream outputStream = null;OutputStreamWriter outputStreamWriter = null;InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader reader = null;StringBuffer resultBuffer = new StringBuffer();String tempLine = null;if (params != null){parameterData = "";if("json".equals(dataType)){parameterData = JSON.toJSONString(params);}else{for (String key : params.keySet()) {parameterData = parameterData + (parameterData.equals("") ? "" : "&") + key + "=" + URLEncoder.encode(String.valueOf(params.get(key)), "UTF8"); }}}HttpURLConnection httpURLConnection = getHttpURLConn(url, parameterData,"POST",token,contentType,connectTimeout,readTimeout);if (parameterData != null){outputStream = httpURLConnection.getOutputStream();outputStreamWriter = new OutputStreamWriter(outputStream);outputStreamWriter.write(parameterData.toString());outputStreamWriter.flush();}inputStream = httpURLConnection.getInputStream();inputStreamReader = new InputStreamReader(inputStream);reader = new BufferedReader(inputStreamReader);while ((tempLine = reader.readLine()) != null) {resultBuffer.append(tempLine);}closeStream(outputStream,outputStreamWriter,inputStream,inputStreamReader,reader);return resultBuffer.toString();}public static String doGet(String url, Map<String, Object> params,String token,String contentType,int connectTimeout,int readTimeout,String dataType) throws Exception{System.out.println("调⽤:-" + url + "接⼝,参数列表:-" + params);String parameterData = null;OutputStream outputStream = null;OutputStreamWriter outputStreamWriter = null;InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader reader = null;StringBuffer resultBuffer = new StringBuffer();String tempLine = null;if (params != null){parameterData = "";if("json".equals(dataType)){parameterData = JSON.toJSONString(params);}else{for (String key : params.keySet()) {parameterData = parameterData + (parameterData.equals("") ? "" : "&") + key + "=" + URLEncoder.encode(String.valueOf(params.get(key)), "UTF8"); }}}HttpURLConnection httpURLConnection = getHttpURLConn(url,parameterData, "GET",token,contentType,connectTimeout,readTimeout); inputStream = httpURLConnection.getInputStream();inputStreamReader = new InputStreamReader(inputStream);}closeStream(outputStream, outputStreamWriter, inputStream, inputStreamReader, reader);return resultBuffer.toString();}private static HttpURLConnection getHttpURLConn(String url, String parameterData,String mode,String token,String contentType,int connectTimeout,int readTimeout)throws MalformedURLException, IOException, ProtocolException{URL localURL = new URL(url);if("GET".equals(mode)){localURL = new URL(url+"?"+parameterData);}URLConnection connection = localURL.openConnection();HttpURLConnection httpURLConnection = (HttpURLConnection)connection;httpURLConnection.setDoOutput(true);if(connectTimeout > 0){httpURLConnection.setConnectTimeout(connectTimeout);//设置连接超时}if(readTimeout > 0){httpURLConnection.setReadTimeout(readTimeout);//设置读取超时}httpURLConnection.setRequestMethod(mode);httpURLConnection.setRequestProperty("Accept","*");httpURLConnection.setRequestProperty("connection","Keep-Alive");httpURLConnection.setRequestProperty("Accept-Charset","utf-8");if(StrUtil.isNotNull(contentType)){httpURLConnection.setRequestProperty("Content-Type",contentType);}else{httpURLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");}if(StrUtil.isNotNull(token) && !"null".equals(token)){httpURLConnection.setRequestProperty("Authorization","Bearer "+token);}httpURLConnection.setRequestProperty("Content-Length",String.valueOf(parameterData == null ? 0 : parameterData.length()));//设置是否从httpUrlConnection读⼊,默认情况下是true;httpURLConnection.setDoInput(true);//Post 请求不能使⽤缓存httpURLConnection.setUseCaches(false);return httpURLConnection;}private static void closeStream(OutputStream outputStream, OutputStreamWriter outputStreamWriter, InputStream inputStream, InputStreamReader inputStreamReader, BufferedReader reader){if (outputStreamWriter != null) {try{outputStreamWriter.close();}catch (IOException e){e.printStackTrace();}}if (outputStream != null) {try{outputStream.close();}catch (IOException e){e.printStackTrace();}}if (reader != null) {try{reader.close();}catch (IOException e){e.printStackTrace();if (inputStreamReader != null) {try{inputStreamReader.close();}catch (IOException e){e.printStackTrace();}}if (inputStream != null) {try{inputStream.close();}catch (IOException e){e.printStackTrace();}}}public static void main(String[] args) throws Exception{String url = "http://127.0.0.1:8080/rdpe-shanxi/rest/commonApiRestful.action";Map<String,Object> params = new HashMap<String,Object>();Map<String,Object> sss = new HashMap<String,Object>();Map<String,Object> bbb = new HashMap<String,Object>();bbb.put("identitycard","BMP20190515170343351");sss.put("action", "txMktSmsSend");sss.put("params",JSON.toJSONString(bbb));params.put("jsonStr",JSON.toJSONString(sss));System.out.println(WebClientUtil.doPost(url,params,"","",3000,3000,""));}public static String invokeQueryByBcapOpen(String requesturl,Map<String,Object> params,String requestmode,String contentType,String token,String dataType,int connectTimeout,int readTimeout) throws Exception {String resultJson="";if("GET".equals(requestmode)){resultJson = WebClientUtil.doGet(requesturl, params, token, contentType, connectTimeout, readTimeout, dataType);}else if("POST".equals(requestmode)){resultJson = WebClientUtil.doPost(requesturl, params, token, contentType, connectTimeout, readTimeout, dataType);}return resultJson;}2、声明接⼝调⽤类package com.bonc.business.restful;import ng.reflect.Method;import java.util.HashMap;import java.util.Map;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSON;import com.bonc.business.db.F;import com.bonc.business.db.TxException;import com.bonc.business.entity.SysParam;import com.bonc.business.tools.ConfigUtil;import com.bonc.business.tools.Encypt;import com.bonc.business.tools.JsonBody;import com.bonc.business.tools.ParamVo;import com.bonc.business.tools.httpclient.WebClientUtil;* Function: 统⼀对外服务RestFul 接⼝. <br/>*/@CrossOrigin@Controller@RequestMapping(value = "/rest")public class CommonApiRestFul {private static final boolean encyptbase64=Boolean.parseBoolean(ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "encyptbase64")); private static final String url = ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "market_helper.url");private static final String requestmode=ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "market_helper.requestmode");private static final String contentType=ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "market_helper.contentType");private static final String token="";private static final String dataType="json";private static final int connectTimeout=30000;private static final int readTimeout=30000;@ResponseBody@RequestMapping(value = "/commonApiRestful.action", method = RequestMethod.POST, produces = CST.PRODUCES_JSON)public Object commonApiRestful(HttpServletRequest request,String jsonStr,HttpServletResponse response) {response.setHeader("Access-Control-Allow-Origin", "*");System.out.println(jsonStr);Map<String,Object> params = new HashMap<String,Object>();params.put("jsonStr",jsonStr);WebClientUtil wc = new WebClientUtil();String resultJsonStr = "";try {resultJsonStr = wc.invokeQueryByBcapOpen(url, params, requestmode, contentType, token, dataType, connectTimeout, readTimeout);} catch (Exception e) {e.printStackTrace();String code = CST.RES_EXCEPTION;String msg = "调⽤接⼝执⾏出错!"+e.getMessage();resultJsonStr = Ajax.responseString(code,msg,"",null);if(encyptbase64){resultJsonStr = Encypt.setEncString(resultJsonStr);}}return resultJsonStr;}}package com.bonc.business.restful;import ng.reflect.Method;import java.util.Map;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ng.StringUtils;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSON;import com.bonc.business.db.F;import com.bonc.business.db.TxException;import com.bonc.business.entity.SysParam;import com.bonc.business.tools.ConfigUtil;import com.bonc.business.tools.Encypt;import com.bonc.business.tools.JsonBody;import com.bonc.business.tools.ParamVo;* Function: 统⼀对外服务RestFul 接⼝. <br/>*/@CrossOrigin@Controller@RequestMapping(value = "/rest")public class CommonApiRestFul2 {/* @Resourceprivate SystemConfigService systemConfigService;@Resourceprivate BaseInterfaceLogService baseInterfaceLogService;@Resourceprivate ExecutorAsynTaskService executorAsynTaskService;*///是否开启传输数据过程中数据加密解密private static final boolean encyptbase64=Boolean.parseBoolean(ConfigUtil.getInstance().getValueByProperty(F.CfgFile, "encyptbase64")); //private static final boolean encyptbase64=false;@ResponseBody@RequestMapping(value = "/commonApiRestful2.action", method = RequestMethod.POST, produces = CST.PRODUCES_JSON)public Object commonApiRestful2(HttpServletRequest request,@RequestBody String jsonStr,HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*");// JsonBody res = new JsonBody();String resultJsonStr="";String code=CST.RES_SECCESS;String msg="调⽤接⼝执⾏成功";Object obj=null;String interfacelogid = "";String resmethod = "";String resparams = "";String createStaff = "";System.out.println(jsonStr);boolean flag = true;try {if(StringUtils.isBlank(jsonStr)){code = CST.RES_EXCEPTION;msg = "不得传⼊空值参数jsonStr";flag = false;}if(flag){//将json参数转换成mapMap<String, Object> requestform = JSON.parseObject(jsonStr, Map.class);if(encyptbase64){jsonStr = Encypt.setDesString(requestform.get("jsonStr")+"");}else{jsonStr = requestform.get("jsonStr")+"";}Map<String, Object> form = JSON.parseObject(jsonStr, Map.class);if(form.containsKey("action")){if(StringUtils.isBlank(form.get("action")+"")){code = CST.RES_EXCEPTION;msg = "接⼝的action参数不能为空";flag = false;}}else{code = CST.RES_EXCEPTION;msg = "传输的json格式参数⽆效,没有action";flag = false;}if(form.containsKey("params")){if(StringUtils.isBlank(form.get("params")+"")){code = CST.RES_EXCEPTION;msg = "接⼝的params参数不能为空";flag = false;}}else{code = CST.RES_EXCEPTION;msg = "传输的json格式参数⽆效,没有params";if(flag){resmethod = (String) form.get("action");resparams = form.containsKey("params")?form.get("params").toString():"";ParamVo vo = new ParamVo();vo.put("paramCode","interfaceconfig");vo.put("paramKey",form.get("action"));//SysParam sysParam = this.systemConfigService.getSysParaByUnionKey(vo);Object result = null;if(true){//校验传参是否有效//Map<String, Object> params = JSON.parseObject(form.get("params")+"", Map.class);/*if(params.containsKey("createStaff") || params.containsKey("userId") || params.containsKey("staffId")){if(StringUtils.isNotBlank(params.get("createStaff")+"")){createStaff = (String) params.get("createStaff");}else if(StringUtils.isNotBlank(params.get("userId")+"")){createStaff = (String) params.get("userId");}else if(StringUtils.isNotBlank(params.get("staffId")+"")){createStaff = (String) params.get("staffId");}}JsonBody check = new JsonBody(params);if(!check.isValid(sysParam.getParamExt1(),"{\"alias\":\"1\"}")){code = CST.RES_EXCEPTION;msg = (String) check.get("_invalidMessage");flag = false;}*/if(flag){//定义的service层处理⽅法类路径://com.bonc.rdpe.service.BusiProcessMonitorService.getBusiProcessMonitorByParamsString paramValue = "com.bonc.business.service.services.TriggerRestfulService.getTriggerInfoList";String[] splitstrs = paramValue.split("\\.");String beanName = splitstrs[splitstrs.length-2];Object service = CrontabTask.getBean(beanName.substring(0, 1).toLowerCase()+beanName.substring(1, beanName.length()));vo = new ParamVo();vo.setParam(JSON.parseObject(form.get("params")+"",Map.class));Class serviceBean = Class.forName(paramValue.substring(0,stIndexOf(".")));Method m =serviceBean.getMethod(paramValue.substring(stIndexOf(".")+1,paramValue.length()),Class.forName("com.bonc.business.tools.ParamVo")); result = m.invoke(service,vo);try{Map<String,Object> resMap = (Map<String, Object>) result;code = (String) resMap.get("code");msg = (String) resMap.get("msg");obj = resMap.get("data");}catch(Exception ex){obj = result;}}}else{code = CST.RES_EXCEPTION;msg = "⽆此服务接⼝,请联系接⼝提供⽅解决!";}}}} catch (Exception e) {e.printStackTrace();code = CST.RES_EXCEPTION;msg = e.getMessage();if(e.getMessage().indexOf("syntax error")!=-1){msg = "传输的参数不是约定的有效的json格式字符串,请检查json字符串是否包含action和params!";}else{msg += "调⽤接⼝执⾏出错!";}}//插⼊接⼝调⽤⽇志信息} catch (TxException e) {e.printStackTrace();}*/resultJsonStr = Ajax.responseString(code,msg,interfacelogid,obj);if(encyptbase64){resultJsonStr = Encypt.setEncString(resultJsonStr);}return resultJsonStr;}}3、postman检测接⼝是否可以正常调⽤http://127.0.0.1:8080/rdpe-shanxi/rest/commonApiRestful.action?jsonStr={ "action": "txMktSmsSend","params": {"pageNo" : 3,"busiCode" : "","triggerCount" : "","eventType" : ""}}。
webservice接⼝与HTTP接⼝学习笔记⼀、webservice 的概念Web 是使应⽤程序可以与平台和编程语⾔⽆关的⽅式进⾏相互通信的⼀项技术。
Web 服务是⼀个软件接⼝,它描述了⼀组可以在⽹络上通过标准化的 XML 消息传递访问的操作。
它使⽤基于 XML 语⾔的协议来描述要执⾏的操作或者要与另⼀个 Web 服务交换的数据。
⼀组以这种⽅式交互的 Web 服务在⾯向服务的体系结构(Service-Oriented Architecture,SOA)中定义了特殊的 Web 服务应⽤程序。
简单的说WebService是⼀个SOA(⾯向服务的编程)的架构,它是不依赖于语⾔,不依赖于平台,可以实现不同的语⾔(通过 xml 描述)间的相互调⽤,通过Internet进⾏基于Http协议的⽹络应⽤间的交互。
通过SOAP在Web上提供的软件服务,使⽤WSDL⽂件进⾏说明,并通过UDDI进⾏注册。
XML:(Extensible Markup Language)扩展型可标记语⾔。
⾯向短期的临时数据处理、⾯向万维⽹络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。
是XML Web Service 的通信协议。
当⽤户通过UDDI找到你的WSDL描述⽂档后,他通过可以SOAP调⽤你建⽴的Web服务中的⼀个或多个操作。
SOAP是XML⽂档形式的调⽤⽅法的规范,它可以⽀持不同的底层接⼝,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL ⽂件是⼀个 XML ⽂档,⽤于说明⼀组 SOAP 消息以及如何交换这些消息。
⼤多数情况下由软件⾃动⽣成和使⽤。
UDDI (Universal Description, Discovery, and Integration) 是⼀个主要针对Web服务供应商和使⽤者的新项⽬。
/docs/index.html/注意,在非java-project中,例如在web-project中可能出现(activation.jar和mail.jar)与工程中的j2ee.jar以及myeclipse中D:\MyEclipse 5.5.1 GA\myeclipse\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_5.5.1\data\libraryset\EE_5的javaee.jar里面的同名包发生冲突,建议把j2ee.jar和javaee.jar中的同名包删除,或者直接使用J2ee.jar把eclipse自带的javaee.jar从工程中去除并加入相应的包1.WSDL2JA V A生成客户端代码2.JAXB3.JAX-WS4.WS-Addressing5.WS-Policy6.WS-Security7.webservice 注释8.拦截器WSDL2JA V A生成客户端代码CXF支持代码生成1)Java to WSDL 、2)WSDL to Java 、3)XSD to WSDL 、4)WSDL to XML5)WSDL to SOAP 、6)WSDL to service如下:D:\apache-cxf-2.2.5\bin>wsdl2java -d d:/cxf-client -p example1.client http://127.0.0.1:8080/ws/HelloWorld?wsdlJAXB/group/10141/topic/12028CXF默认的数据绑定使用的JAXB,XFIRE使用Aegis替代数据绑定就是把java对象转化为xml和把xml文件转化为java对象不管使用任何的XML解析代码库(dom4j等),对于xml只是一个解析工作而已,不能马上绑定到java 对象。
对于对象,每次都需要set 或者get相应的属性,当然也可以使用map 来保存xml配置。
WebService学习,开发总结--唐木之无线观察原文地址:基本概念:1,什么是 Web 服务?Web 是使应用程序可以以与平台和编程语言无关的方式进行相互通信的一项技术。
Web 服务是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。
它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换的数据。
一组以这种方式交互的Web 服务在面向服务的体系结构(Service-Oriented Architecture,SOA)中定义了特殊的Web 服务应用程序。
2,什么是SOAP?SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的轻量级协议,是一个基于XML的协议。
使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一种语言相互通信。
SOAP包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;SOAP RPC表示(RPC representa tion),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
应用中比较关注的是envelop,由一个或多个Header和一个Bo dy组成。
SOAP在可互操作的基础 Web 服务协议栈中的位置:3,什么是Axis?Axis本质上就是一个SOAP引擎(Apache Axis is an implementation of the SOAP),提供创建服务器端、客户端和网关SOAP操作的基本框架。
但Axis并不完全是一个SOAP引擎,它还包括:是一个独立的SOAP服务器。
环境介绍:客户端部署环境:weblogic客户端开发环境:jetty服务器端webservice环境:cxf2.5.21.Axis首先可以直接在Eclipse通过wsdl文件生成服务的Java Proxy, 然后直接通过ServiceSoapProxy proxy = new ServiceSoapProxy();proxy.invokMethod();的方式来调用服务,具体的步骤如下:●将axis需要的jar包加入到maven项目中的pom的xml文件中,如下:<dependency><groupId>org.apache.axis</groupId><artifactId>axis</artifactId><version>1.4</version></dependency><dependency><groupId>org.apache.axis</groupId><artifactId>axis-jaxrpc</artifactId><version>1.4</version></dependency><dependency><groupId>org.apache.axis</groupId><artifactId>axis-saaj</artifactId><version>1.4</version></dependency><dependency><groupId>axis</groupId><artifactId>axis-wsdl4j</artifactId><version>1.3</version></dependency><dependency><groupId>commons-discovery</groupId><artifactId>commons-discovery</artifactId><version>0.6-SNAPSHOT</version></dependency>●右击项目,创建一个Web Service Client客户端,其中Service definition即为wsdl地址●编写调用代码try {PaymentServiceImpServiceLocatorserviceLocator = new PaymentServiceImpServiceLocator();//接口服务IPaymentServicepaymentService = paymentServiceImpServiceLocator.getPaymentServiceImpPort();//获取服务PaymentDatapaymenData = new PaymentData();//参数对象PaymentDataResultpaymentDataService = paymentServiceImpPort.payment(paymenData);//交互PaymentDataResultItem[] paymentDataReslutItems = paymentDataService.getPaymentDataReslutItems();//处理返回信息} catch (Exception e) {e.printStackTrace();}●jar包冲突问题开发环境是在jetty下测试没有问题,当部署到weblogic上时由于axis.jar与weblogic中jar 包冲突,报错如下:loader constraint violation in interface itable initialization:when resolving method "org.apache.axis.client.Service.getPort(Ljavax/xml/namespace/QName;Ljava/lang/Class;)Ljava/r mi/Remote;"the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class, org/apache/axis/client/Service,and the class loader (instance of sun/misc/Launcher$AppClassLoader) for interface javax/xml/rpc/Service have different Class objectsfor the type javax/xml/namespace/QName used in the signatureloader constraint violation in interface itable initialization: when resolving method "org.apache.axis.client.Service.getPort(Ljavax/xml/namespace/QName;Ljava/lang/Class;)Ljava/r mi/Remote;" the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class, org/apache/axis/client/Service, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for interface javax/xml/rpc/Service have different Class objects for the type javax/xml/namespace/QName used in the signature解决方式1(未验证):Weblogic优先加载jar包:配置weblogic自带了很多jar包,当工程中的jar和weblogic自带jar版本不一致时往往会出现错误。
为了解决在weblogic中jar包冲突的问题,可以在web-inf下创建一个weblogic.xml。
内容如下:<?xml version="1.0"?><weblogic-web-appxmlns="/ns/weblogic/weblogic-web-app"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/ns/weblogic/weblogic-web-app /ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"><container-descriptor><prefer-web-inf-classes>true</prefer-web-inf-classes>//优先加载web工程中的jar包</container-descriptor></weblogic-web-app>解决方式2(未验证):如果是系统级包(javax,org.apache.*)冲突就要建一个weblogic的ear包含你的war,META-INF/weblogic-application.xml,模仿下面的定义修改,以你为准的应用包名(多级的话都要定义)。
再把你需要的新版系统级别jar放到ear的APP-INF/lib中。
这样weblogic加入系统级包就以你的为准了。
参考地址如下:/question/140462_70989(参考地址)2.CXFcxf客户端有两种方式:JaxWsProxyFactoryBean和JaxWsDynamicClientFactory第一种方式:这种调用service的好处在于调用过程非常简单,就几行代码就完成一个webservice的调用,但是客户端也必须依赖服务器端的接口,这种调用方式限制是很大的,要求服务器端的webservice必须是java实现,这样也就失去了使用webservice的意义。
第二种方式:使用JaxWsDynamicClientFactory类,只要指定服务器端wsdl文件的位置,然后指定要调用的方法和方法的参数即可。
推荐使用第二种方式!(版本最后早2.6以上,2.5版本jar冲突有很多,并且跟jdk1.5还有很多冲突,推荐使用高版本!)具体步骤如下:●命令生成客户端代码在命令提示符中使用如下命令:wsdl2java -p com -d src -all aa.wsdl命令参数说明:p 指定其wsdl的命名空间,也就是要生成代码的包名:-d 指定要产生代码所在目录-client 生成客户端测试web service的代码-server 生成服务器启动web service的代码-impl生成web service的实现代码-ant 生成build.xml文件●将上述文件生成的java文件拷贝到你的项目中●将cxf需要的jar如下:●编写调用代码//创建客户端的代理,生成factory对象,用于调用服务端的方法JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();factory.setServiceClass(IPaymentService.class); //接口服务factory.setAddress("http://192.168.1.195:8080/fgp/ws/IPaymentService"); //wsdl地址IPaymentService service = (IPaymentService)factory.create(); //创建服务PaymentData data = new PaymentData();//传递参数的对象类PaymentDataResult result = service.payment(data); //调用webserviceSystem.out.println("status: "+result.getStatus());//输出结果3.JDKJDK的bin文件夹中的wsimport.exe可以依据wsdl文件生成相应的类文件,然后用这些类文件,就可以像调用本地的类一样调用WebService提供的方。