webservice接口java调用方式(非原创,侵删)

xiaoxiao2021-02-28  107

webservice接口的java代码调用方式有多种,见以下

第一种方式采用soap的方式:

import javax.xml.*; public String getwebservice() throws Exception { String temp = "";//用来存放返回的报文内容 try { //实例化一个soap连接对象工厂 SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory.newInstance(); //实例化一个连接对象 SOAPConnection connection = soapConnFactory.createConnection(); //实例化一个消息对象 MessageFactory messageFactory = MessageFactory.newInstance(); //实例化一个消息 SOAPMessage message = messageFactory.createMessage(); //获取消息中soap消息部分的句柄 SOAPPart soapPart = message.getSOAPPart(); //获取soap消息部分中的信封句柄 SOAPEnvelope envelope = soapPart.getEnvelope(); //获取信封中需要填写的请求报文部分的句柄 SOAPBody body = envelope.getBody(); //以上内容均是实例化各个对象 //下面函数作用为构建请求头,一共三个参数,其中第一个参数为要访问webservice中的那个函数的函数名(注意大小写敏感) 第二个参数需要按照情况来拼接,可以先访问对方的webservice地址查看是否标签中有这个元素 第三个参数为访问空间,也就是对应于wsdl文档中的namespace内容。 SOAPElement bodyElement = body.addChildElement(envelope.createName(operationName , "web", targetNamespace)); //此访问距离假定我要访问的webservice函数有两个参数 //下面是第一个参数为参数名(大小写敏感)而第二个参数和第三个参数要视具体的webservice而定 SOAPElement firstElemnt = bodyElement.addChildElement(envelope.createName("" , "", "")); Name firstName = envelope.createName("type"); //firstName为入参一的值,后面的是入参的类型 firstElemnt.addAttribute(firstName, "String"); firstElemnt.addTextNode(); //以上就是第一个参数的添加 //下面是第二个参数的添加和第一个没有任何区别 SOAPElement secondElemnt = bodyElement.addChildElement(envelope.createName("" , "", "")); Name secondName = envelope.createName("type"); secondElemnt.addAttribute(secondName, "String"); secondElemnt.addTextNode(); //下面这句话的意思是保存消息的修改 message.saveChanges(); //下面的webServiceURL为webservice的访问地址 String destination = webServiceURL; //下面为调用 SOAPMessage reply = connection.call(message, destination); //如果返回的消息不为空需要进行处理 if(reply!=null){ //这部分的处理就是将返回的值转换为字符串的格式,也就是流和串之间的转换 Source source = reply.getSOAPPart().getContent(); Transformer transformer = TransformerFactory.newInstance().newTransformer(); ByteArrayOutputStream myOutStr = new ByteArrayOutputStream(); StreamResult res = new StreamResult(); res.setOutputStream(myOutStr); transformer.transform(source,res); //针对于汉子的编码格式,需要自己制定 temp = myOutStr.toString("UTF-8"); } //注意!一定要关闭连接 connection.close(); } catch(Exception e) { System.out.println(e.getMessage()); } if(temp == null){ temp = ""; } return temp; } 第二种方式,采用httpclient:

import org.apache.* public String updateLeechdom() throws Exception {   //首先定义访问的格式和头,这部分的由来最简单的办法就是直接将对方提供的webservice地址在浏览器中访问获取     //注意用转义符处理特殊符号   String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?> "; xml = xml + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"; xml = xml + "<soap:Body>"; xml = xml + "<function1 xmlns=\"namespace\">"; xml = xml + "<para1>" + para1 + "</para1>"; xml = xml + "<para2>" + para2 + "</para2>"; xml = xml + "</function2>"; xml = xml + "</soap:Body>"; xml = xml + "</soap:Envelope>"; String result =""; PostMethod postMethod = new PostMethod(webServiceURL); HttpClientParams httpClientParams = new HttpClientParams();   //设置链接的访问时间 httpClientParams.setConnectionManagerTimeout(999999);   //设置超时时间 httpClientParams.setSoTimeout(999999);   //创建http线程 MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); HttpClient httpClient = new HttpClient(httpClientParams,connectionManager); postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler(11, true)); try{   //设置返回值的编码格式 postMethod.setRequestEntity(new StringRequestEntity(xml, "text/xml", "GBK")); postMethod.addRequestHeader("Connection", "close");   //设置一个返回的状态值用以判断是否调用webservice成功 int statusCode = httpClient.executeMethod(postMethod); if (statusCode != HttpStatus.SC_OK) { } else {   //下面还是老规矩进行流和字符串之间的转换 InputStream out = postMethod.getResponseBodyAsStream(); BufferedReader in = new BufferedReader(new InputStreamReader(out)); StringBuffer buffer = new StringBuffer(); String line = ""; while ((line = in.readLine()) != null){ buffer.append(line); } result = buffer.toString(); } } catch (Exception e) { } finally { postMethod.releaseConnection(); } return result; } 第三种方式,使用javax包:

public String test() throws Exception { String result = ""; try {  //这一句的作用是定义系统的操作变量,有些程序在不添加这段代码的时候也运行正常。 System.setProperty(org.apache.axis.client.ServiceFactory.SERVICEFACTORY_PROPERTY,"org.apache.axis.client.ServiceFactory" ); //定义访问变量,参数一位webservice的访问地址,参数二位webservice使用的命名空间 QName servicename = new QName(webServiceURL,namespace); //定义操作变量,操作变量中传入的参数为前面已经定义的访问变量 javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(servicename); //实例化调用变量 javax.xml.rpc.Call call = service.createCall(); //添加调用地址 call.setTargetEndpointAddress(webServiceURL); //添加调用的函数的命名空间以及函数名称 QName operationname = new QName(namespace, operationName); //设置调用操作 call.setOperationName(operationname); //定义传入的参数,参数1是入参名大小写敏感,参数2为参数类型(字符/数字……),参数3为参数类型(入参/出参) call.addParameter("para1",XMLType.XSD_STRING,ParameterMode.IN ); //第二个参数的定义同上 call.addParameter("para2",XMLType.XSD_STRING,ParameterMode.IN ); //定义返回值的格式,第一个参数为命名空间,第二个参数为返回值类型,这里需要注意的是返回值的类型是webservice开发商提供,我们需要与其保持一致 QName returnname = new QName(namespace, "string"); call.setReturnType(returnname, String.class); //进行调用传入对应入参的值,并且将返回的对象转换为字符串。 result = call.invoke(new Object[]{para1,para2}).toString(); //异常处理 if(result==null) { result = ""; } }catch (Exception e){ e.printStackTrace(); } return result; } 第四种方式,axis包:

import org.apache.axis.* public String test() throws Exception { String result =""; //实例化访问对象 Service service = new Service(); //实例化调用对象 Call call = (Call) service.createCall(); //在调用对象中添加webservice地址 call.setTargetEndpointAddress(new java.net.URL(webServiceURL)); //在调用对象中添加webservice对应的命名空间,以及将要调用的函数名 call.setOperationName(new QName(namespace,operationName)); //设置入参,第一个参数是命名空间以及参数名,这两个参数是采用一个Qname变量打包传入的,第二个参数是入参的类型(字符或者数字)第三个参数是入参种类 //“IN”的含义代表入参 call.addParameter(new QName(namespace,"para1"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); //第二个参数与前面一样 call.addParameter(new QName(namespace,"para2"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); //是否是soapaction这里需要看webservice是否要求如下格式,如果没有要求可以不添加此设置 call.setUseSOAPAction(true); //设置返回值格式(字符串或者组装对象) call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING); //如果前面要求是soapaction的话需要添加下面这句话,用来之中是访问那个命名空间上的那个方法 call.setSOAPActionURI(namespace + "/" + operationName); //调用,参入两个入参para1和para2的值,并且将返回值转换为String类型 result = call.invoke(new Object[]{para1,para2}).toString(); return result; } 本文为转载,感谢原作者。原作者链接:

http://www.cnblogs.com/Sabasdian/p/JavaAndWebservice_1.html

http://www.cnblogs.com/Sabasdian/p/JavaAndWebservice_2.html

http://www.cnblogs.com/Sabasdian/p/JavaAndWebservice_3.html

http://www.cnblogs.com/Sabasdian/p/JavaAndWebservice_4.html

转载请注明原文地址: https://www.6miu.com/read-66770.html

最新回复(0)