WebService协议

http 和 webservice 都是基于TCP/IP协议的应用层协议

webservice是基于http的soap协议传输数据 webservice=soap=http+xml,webservice协议就是有http+xml组成的,其中xml中会用到wsdl,wsdl是描述语言xml中的一种格式。

socket是基于TCP/IP的传输协议,是对TCP/IP协议的封装

socket和TCP都是基于TCP/IP传输层协议

注:Restful是一种接口规范,而不是接口协议,restful接口规范中也会用到http协议。

以下内容转载自:https://blog.csdn.net/sunroyi666/article/details/51917991 因现在大部分会用http协议不用webservice协议,故没有实际操作,只是转载来了解理论。

一. WSDL WebService的创建:
1.创建【Web Service Project】:

image.png

WebServices Framework要选JAX-WS:


image.png

2.写一个简单的测试用例:

package com.webservice;

public class WebService{

public String printData(String printerName){
    String strRet = "Welcome to use WebService, " + printerName;
    
    System.out.println("Print from WebService:" + strRet);
    
    return strRet;
}   

}

3.发布Web Service:
点击工具栏的New Web Service:


image.png

Strategy选择第二个(Create web service from Java class):

image.png

勾选【Generate WSDL in project】:


image.png

点击【Finish】后,系统会在WEB-INF/wsdl下生成两个文件:

image.png

WebServiceService.wsdl:这个文件是用来描述Web Service内容的
<?xml version="1.0" encoding="UTF-8"?>

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.com/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="WebServiceService" targetNamespace="http://webservice.com/">
<types>
<xsd:schema>
<xsd:import namespace="http://webservice.com/" schemaLocation="WebServiceService_schema1.xsd"/>
</xsd:schema>
</types>
<message name="printData">
<part element="tns:printData" name="parameters"/>
</message>
<message name="printDataResponse">
<part element="tns:printDataResponse" name="parameters"/>
</message>
<portType name="WebServiceDelegate">
<operation name="printData">
<input message="tns:printData"/>
<output message="tns:printDataResponse"/>
</operation>
</portType>
<binding name="WebServicePortBinding" type="tns:WebServiceDelegate">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="printData">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="WebServiceService">
<port binding="tns:WebServicePortBinding" name="WebServicePort">
<soap:address location="http://localhost:8080/WebService/WebServicePort"/>
</port>
</service>
</definitions>

WebServiceService_schema1.xsd:用来说明Web Service的命令及其参数
比如:sample里面的WebService是【printData】,有一个String类型的参数【arg0】,返回值一个String类型的值。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.com/" targetNamespace="http://webservice.com/" version="1.0">

<xs:element name="printData" type="tns:printData"/>

<xs:element name="printDataResponse" type="tns:printDataResponse"/>

<xs:complexType name="printData">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="printDataResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

将WebService项目部署到Tomcat即可。
(部署方法略)

二. WSDL WebService的调用:
方法1:创建Web Service Client来调用:
1.创建【Java Project】:


image.png

2.点击工具栏的New Web Service Client:

image.png
image.png

3.选择【WSDL URL】:

image.png

4.点击【Next】完成创建后,在src/com/webservice下,自动生成相关文件。(WebServiceTest.java除外,这个是自己创建的调用文件)


image.png

5.创建【WebServiceTest.java】


image.png

代码如下:
package com.webservice;

public class WebServiceTest{

public static void main(String[] args){
    WebServiceService wssPrintData = new WebServiceService();
    WebServiceDelegate wsdPrintData = wssPrintData.getWebServicePort();
    
    System.out.println(wsdPrintData.printData("sun"));
}   

}

6.【WebServiceTest.java】右键→Run As→Java Application
输出结果:
Welcome to use WebService, sun

方法2:用HttpClient调用:
package com.httpclientforwsdl;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

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

public class WebServiceHttpClientTest{

public synchronized static String accessService(String wsdl,String ns,String method,Map<String,String> params,String result)throws Exception{  
    //拼接参数  
    String param = getParam(params);  
    String soapResponseData = "";  
    //拼接SOAP  
    StringBuffer soapRequestData = new StringBuffer("");  
    soapRequestData.append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");  
    soapRequestData.append("<soap:Body>");  
    soapRequestData.append("<ns1:"+method+" xmlns:ns1=\""+ns+"\">");  
    soapRequestData.append(param);  
    soapRequestData.append("</ns1:"+method+">");  
    soapRequestData.append("</soap:Body>" + "</soap:Envelope>");  
    PostMethod postMethod = new PostMethod(wsdl);  
    // 然后把Soap请求数据添加到PostMethod中  
    byte[] b=null;  
    InputStream is=null;  
    try {  
        b = soapRequestData.toString().getBytes("utf-8");   
        is = new ByteArrayInputStream(b, 0, b.length);  
        RequestEntity re = new InputStreamRequestEntity(is, b.length,"text/xml; charset=UTF-8");  
        postMethod.setRequestEntity(re);  
        HttpClient httpClient = new HttpClient();  
        int status = httpClient.executeMethod(postMethod);  
        System.out.println("status:"+status);  
        if(status==200){  
            soapResponseData = getMesage(postMethod.getResponseBodyAsString(),result);  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
    } finally{  
        if(is!=null){  
            is.close();  
        }  
    }  
    return soapResponseData;  
}  
  
public static String getParam(Map<String,String> params){  
    String param = "";  
    if(params!=null){  
        Iterator<String> it  = params.keySet().iterator();  
        while(it.hasNext()){  
            String str = it.next();  
            param+="<"+str+">";  
            param+=params.get(str);  
            param+="</"+str+">";  
        }  
    }  
    return param;  
}  
  
public static String getMesage(String soapAttachment,String result){  
    System.out.println("message:"+soapAttachment);  
    if(result==null){  
        return null;  
    }  
    if(soapAttachment!=null && soapAttachment.length()>0){  
        int begin = soapAttachment.indexOf(result);  
        begin = soapAttachment.indexOf(">", begin);  
        int end = soapAttachment.indexOf("</"+result+">");  
        String str = soapAttachment.substring(begin+1, end);  
        str = str.replaceAll("<", "<");  
        str = str.replaceAll(">", ">");  
        return str;  
    }else{  
        return "";  
    }  
}  
  
/** 
 * @param args 
 */  
public static void main(String[] args) {   
    try {  
        Map<String,String> param = new HashMap<String,String>();  
        param.put("arg0", "sun");
        String wsdl="http://localhost:8080/WebService/WebServicePort?wsdl";  
        String ns = "http://webservice.com/";  
        String method="printData";  
        String response =accessService(wsdl,ns,method,param,"return");  
        System.out.println("main:"+response);  
          
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}  

}

显示结果:
status:200
七月 15, 2016 3:43:27 下午 org.apache.commons.httpclient.HttpMethodBase getResponseBody
警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.
message:<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:printDataResponse xmlns:ns2="http://webservice.com/"><return>Welcome to use WebService, sun</return></ns2:printDataResponse></S:Body></S:Envelope>
main:Welcome to use WebService, sun


作者:Royi666
来源:CSDN
原文:https://blog.csdn.net/sunroyi666/article/details/51917991
版权声明:本文为博主原创文章,转载请附上博文链接!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容