Java Webservice调用总结

来源:互联网 发布:网络歌手蒙面哥 编辑:程序博客网 时间:2024/05/06 08:09

调用asp.net发布的webservice服务

下面是soap1.2请求的实例:

 POST /user/yfengine.asmx HTTP/1.1    Host: oserver.palm-la.com    Content-Type: application/soap+xml; charset=utf-8    Content-Length: length    <?xml version="1.0" encoding="utf-8"?>    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">          <soap12:Body>            <Login xmlns="Loginnames">                  <userId>string</userId>                  <password>string</password>            </Login>          </soap12:Body>    </soap12:Envelope>

通过axis2调用:

String serviceEpr = "http://127.0.0.1/rightproject/WebServices/RightService.asmx";public String callWebServiceByAixs(String userId, String password, String serviceEpr){                      try {               Service service = new Service();               Call call = (Call)service.createCall();               call.setTargetEndpointAddress(new java.net.URL(serviceEpr));               //服务名               call.setOperationName(new QName("http://tempuri.org/", "Login"));                  //定义入口参数和参数类型               call.addParameter(new QName("http://tempuri.org/", "userId"),XMLType.XSD_STRING, ParameterMode.IN);               call.addParameter(new QName("http://tempuri.org/", "password"),XMLType.XSD_STRING, ParameterMode.IN);               call.setUseSOAPAction(true);               //Action地址               call.setSOAPActionURI("http://tempuri.org/Login");               //定义返回值类型               call.setReturnType(XMLType.XSD_INT);                              //调用服务获取返回值                   String result = String.valueOf(call.invoke(new Object[]{userId, password}));               System.out.println("返回值 : " + result);               return result;              } catch (ServiceException e) {               e.printStackTrace();              } catch (RemoteException e) {               e.printStackTrace();              } catch (MalformedURLException e) {               e.printStackTrace();              }                return null;    }
通过HttpClient调用webService

soap请求xml,将请求参数拼接到xml中:

<?xml version="1.0" encoding="utf-8"?>        <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">          <soap12:Body>            <Login xmlns="Loginnames">                  <userId>张氏</userId>                  <password>123456</password>            </Login>          </soap12:Body>    </soap12:Envelope>
调用实例:

String serviceEpr = "http://127.0.0.1/rightproject/WebServices/RightService.asmx";String contentType = "application/soap+xml; charset=utf-8";public static String callWebService(String soapRequest, String serviceEpr, String contentType){                PostMethod postMethod = new PostMethod(serviceEpr);        //设置POST方法请求超时        postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);                try {                        byte[] b = soapRequest.getBytes("utf-8");            InputStream inputStream = new ByteArrayInputStream(b, 0, b.length);            RequestEntity re = new InputStreamRequestEntity(inputStream, b.length, contentType);            postMethod.setRequestEntity(re);                        HttpClient httpClient = new HttpClient();            HttpConnectionManagerParams managerParams = httpClient.getHttpConnectionManager().getParams();             // 设置连接超时时间(单位毫秒)            managerParams.setConnectionTimeout(30000);            // 设置读数据超时时间(单位毫秒)            managerParams.setSoTimeout(600000);             int statusCode = httpClient.executeMethod(postMethod);            if (statusCode != HttpStatus.SC_OK)                  throw new IllegalStateException("调用webservice错误 : " + postMethod.getStatusLine());                         String soapRequestData =  postMethod.getResponseBodyAsString();            inputStream.close();            return soapRequestData;        } catch (UnsupportedEncodingException e) {            return "errorMessage : " + e.getMessage();        } catch (HttpException e) {            return "errorMessage : " + e.getMessage();        } catch (IOException e) {            return "errorMessage : " + e.getMessage();        }finally{             postMethod.releaseConnection();         }    }
调用其它webservice

1:通过axis2调用:

serviceEpr:服务地址

nameSpace:服务命名空间

methodName:服务名称

Object[] args = new Object[]{"请求的数据"};

DataHandler dataHandler = new DataHandler(new FileDataSource("文件路径"));

传文件的话,"请求的数据"可以用DataHandler对象,但是WebService服务需提供相应的处理即:

InputStream inputStream = DataHandler.getInputStream();

然后将inputStream写入文件即可。还可以将文件读取为二进制流进行传递。

public static String callWebService(String serviceEpr, String nameSpace, Object[] args, String methodName){        try{                    RPCServiceClient serviceClient = new RPCServiceClient();            Options options = serviceClient.getOptions();            EndpointReference targetEPR = new EndpointReference(serviceEpr);            options.setTo(targetEPR);                        //===========可以解决多次调用webservice后的连接超时异常========            options.setManageSession(true);               options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT,true);                          //设置超时            options.setTimeOutInMilliSeconds(60000L);            // 设定操作的名称            QName opQName = new QName(nameSpace, methodName);            // 设定返回值            // 操作需要传入的参数已经在参数中给定,这里直接传入方法中调用            Class[] opReturnType = new Class[] { String[].class };            //请求并得到返回值            Object[] response = serviceClient.invokeBlocking(opQName, args, opReturnType);            String sResult = ((String[]) response[0])[0];            //==========可以解决多次调用webservice后的连接超时异常=======            serviceClient.cleanupTransport();             return sResult;                }catch(AxisFault af){            return af.getMessage();        }    }
2:传统调用方式:

serviceEpr:服务器地址

nameSpace:服务命名空间

methodName:服务名称

private static void callWebService(String serviceEpr, String nameSpace, String methodName) {        try {            EndpointReference endpointReference = new EndpointReference(serviceEpr);            // 创建一个OMFactory,下面的namespace、方法与参数均需由它创建            OMFactory factory = OMAbstractFactory.getOMFactory();            // 创建命名空间            OMNamespace namespace = factory.createOMNamespace(nameSpace, "urn");            // 参数对数            OMElement nameElement = factory.createOMElement("arg0", null);            nameElement.addChild(factory.createOMText(nameElement, "北京"));            // 创建一个method对象            OMElement method = factory.createOMElement(methodName, namespace);            method.addChild(nameElement);            Options options = new Options();            // SOAPACTION            //options.setAction("sayHi");            options.setTo(endpointReference);                        options.setSoapVersionURI(org.apache.axiom.soap.SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);             ServiceClient sender = new ServiceClient();            sender.setOptions(options);            // 请求并得到结果            OMElement result = sender.sendReceive(method);            System.out.println(result.toString());        } catch (AxisFault ex) {            ex.printStackTrace();        }    }
3:通过CXF调用:

serviceEpr:服务器地址

nameSpace:服务命名空间

methodName:服务名称

public static String callWebService(String serviceEpr, String nameSpace, String methodName){                JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();        Client client = clientFactory.createClient(serviceEpr);        Object[] resp = client.invoke(methodName, new Object[]{"请求的内容"});        System.out.println(resp[0]);    }        //传文件,将文件读取为二进制流进行传递,“请求内容”则为二进制流    private byte[] getContent(String filePath) throws IOException{               FileInputStream inputStream = new FileInputStream(filePath);         ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);          System.out.println("bytes available: " + inputStream.available());            byte[] b = new byte[1024];                int size = 0;                    while((size = inputStream.read(b)) != -1)               outputStream.write(b, 0, size);                  inputStream.close();           byte[] bytes = outputStream.toByteArray();          outputStream.close();         return bytes;      }





0 0
原创粉丝点击