基于HttpClient的WebService调用

WebService的调用有很多种方式,本地调用(静态调用),远程调用(动态)

关于上边静态,动态是我个人的理解,没有权威性,个人喜好而已

本地调用

具体操作请看:http://www.jianshu.com/p/1e9582a4b340

远程调用

远程调用的方式比较多,例如利用cxf,axis、axis2 、HttpClient等框架的调用,这里具体看基于HttpClient的调用, HttpClient 3和4 使用方式稍有区别,经测试,4.5.2版本不支持jdk1.5

  • HttpClient 3.x
public static String doPostSOAP_RemoveUser(String logonName){
        Properties prop = new Properties(); 
        PostMethod post = null;
        String responseXml = null;
        String json= null;
        try {
        InputStream in = HttpClient3_0_SOAPUtil.class.getResourceAsStream("/sysPath.properties");
        prop.load(in);
        String postURL = prop.getProperty("postURL");
        post = new PostMethod(postURL);
        post.setRequestHeader("Content-Type","text/xml;charset=utf-8");
            //File input = new File(strXMLFilename);
            // Prepare HTTP post
            // Request content will be retrieved directly
            // from the input stream
                String systemId = prop.getProperty("systemId");                      
                String strWSDLXml_RemoveUser = "" 
                        + ""
                        + "   "
                        + "   "
                        + "      "
                        + "         "
                        + "         "+systemId+""
                        + "         "
                        + "         "+logonName+""
                        + "      "
                        + "   "
                        + "";
                System.out.println(strWSDLXml_RemoveUser);
                String strSoapAction_RemoveUser = prop.getProperty("strSoapAction_RemoveUser");
            byte[] b = strWSDLXml_RemoveUser.getBytes("utf-8");
            InputStream is = new ByteArrayInputStream(b,0,b.length);
            RequestEntity entity = new InputStreamRequestEntity(is,b.length,"application/soap+xml; charset=utf-8");
            post.setRequestEntity(entity);
            // consult documentation for your web service
            post.setRequestHeader("SOAPAction", strSoapAction_RemoveUser);
            // Get HTTP client
            HttpClient httpclient = new HttpClient();
            // Execute request
            int result = httpclient.executeMethod(post);
            // Display status code
            //System.out.println("Response status code: " + result);
            // Display response
            //System.out.println("Response body: ");
            responseXml = post.getResponseBodyAsString();
            //System.out.println(responseXml);
            Document document_ret = DocumentHelper.parseText(responseXml);
            json = document_ret.getRootElement().element("Body").element("RemoveUserResponse").element("RemoveUserResult").getText();
            
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            // Release current connection to the connection pool once you are done
            post.releaseConnection();
        }
        return json;
    }

这是我个人根据相应业务而产生的代码,不同业务可根据业务需求做相应的改动,strWSDLXml_RemoveUser 这个字符串是在soapUI 中得到,

基于HttpClient的WebService调用_第1张图片
image.png

关于soapUI我也是小白,不多做解释,具体自行百度、google。
上述代码使用了到了外部配置文件


sysPath 内容如下

systemId=xxxxxxxxxxxxxxxxxxxx
postURL=http://xxx.xxx.xxx.xxx:9999/webservice/externalservice/userservice.asmx
strSoapAction_RemoveUser=http://xxxxxx.xxx/RemoveUse

jar 包依赖关系

基于HttpClient的WebService调用_第2张图片
image.png

调用上述方法,将会得到调用webService后的响应内容
下边给出3.x的官方提供的示例

import java.io.File;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.FileRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;

/**
 *
 * This is a sample application that demonstrates
 * how to use the Jakarta HttpClient API.
 *
 * This application sends an XML document
 * to a remote web server using HTTP POST
 *
 * @author Sean C. Sullivan
 * @author Ortwin Glueck
 * @author Oleg Kalnichevski
 * @author Paul King
 */
public class PostSOAP {

    /**
     *
     * Usage:
     *          java PostSOAP http://mywebserver:80/ SOAPAction c:\foo.xml
     *
     *  @param args command line arguments
     *                 Argument 0 is a URL to a web server
     *                 Argument 1 is the SOAP Action
     *                 Argument 2 is a local filename
     *
     */
    public static void main(String[] args) throws Exception {
        if (args.length != 3) {
            System.out.println("Usage: java -classpath  [-Dorg.apache.commons.logging.simplelog.defaultlog=] PostSOAP   ]");
            System.out.println(" - must contain the commons-httpclient.jar and commons-logging.jar");
            System.out.println(" - one of error, warn, info, debug, trace");
            System.out.println(" - the URL to post the file to");
            System.out.println(" - the SOAP action header value");
            System.out.println(" - file to post to the URL");
            System.out.println();
            System.exit(1);
        }
        // Get target URL
        String strURL = args[0];
        // Get SOAP action
        String strSoapAction = args[1];
        // Get file to be posted
        String strXMLFilename = args[2];
        File input = new File(strXMLFilename);
        // Prepare HTTP post
        PostMethod post = new PostMethod(strURL);
        // Request content will be retrieved directly
        // from the input stream
        RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
        post.setRequestEntity(entity);
        // consult documentation for your web service
        post.setRequestHeader("SOAPAction", strSoapAction);
        // Get HTTP client
        HttpClient httpclient = new HttpClient();
        // Execute request
        try {
            int result = httpclient.executeMethod(post);
            // Display status code
            System.out.println("Response status code: " + result);
            // Display response
            System.out.println("Response body: ");
            System.out.println(post.getResponseBodyAsString());
        } finally {
            // Release current connection to the connection pool once you are done
            post.releaseConnection();
        }
    }
}

3.x 项目官方地址:http://hc.apache.org/httpclient-3.x/

  • HttpClient4.x
    项目官方地址:http://hc.apache.org/

jar包依赖


image.png
 public static String doPostSoap1_1(String postUrl, String soapXml,  
                String soapAction) {  
            String retStr = "";  
          
            // 创建HttpClientBuilder  
            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();  
            // HttpClient  
            CloseableHttpClient closeableHttpClient = httpClientBuilder.build();  
            HttpPost httpPost = new HttpPost(postUrl);  
                    //  设置请求和传输超时时间  
            RequestConfig requestConfig = RequestConfig.custom()  
                    .setSocketTimeout(socketTimeout)  
                    .setConnectTimeout(connectTimeout).build();  
            httpPost.setConfig(requestConfig);  
            try { 
                httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");  
                httpPost.setHeader("SOAPAction", soapAction);  
                StringEntity data = new StringEntity(soapXml,  
                        Charset.forName("UTF-8"));  
                httpPost.setEntity(data);  
                CloseableHttpResponse response = closeableHttpClient.execute(httpPost);  
                HttpEntity httpEntity = response.getEntity();  
                if (httpEntity != null) {  
                    // 打印响应内容  
                    retStr = EntityUtils.toString(httpEntity, "UTF-8");  
                   System.out.println("response:" + retStr);  
                }  
                // 释放资源  
                closeableHttpClient.close();  
            } catch (Exception e) {  
               // logger.error("exception in doPostSoap1_1", e);  
                e.printStackTrace();
            }  
            return retStr;  
        }  
     public static void main(String[] args) {
                String systemId = "ssss";
                String jsonUserInfo="";
                String adduser = "" 
                        + ""
                        + "   "
                        + "   "
                        + "      "
                        + "         "
                        + "         "+systemId+""
                        + "         "
                        + "         "+jsonUserInfo+""
                        + "      "
                        + "   "
                        + "";
                String postUrl = "http://1xxx.xxx.x.x:9999/webservice/externalservice/userservice.asmx"; 
                String repXml= doPostSoap1_1(postUrl, adduser, "http://tempuri.org/AddUser");                          
        }

之后解析repXml得到响应的json 字符串;

你可能感兴趣的:(基于HttpClient的WebService调用)