webService简介
一、WebService概念
1、如何调用另外一台机器上的java程序
helloService.sayHello#name#666
2、使用中的WebService实现---使用@WebService及Endpoint ,,Java1.6_20以后的版本
A、发布一个WebService
@WebService
public class HelloWorld {
public String sayHello(String name){
System.out.println(name+"调了SayHello!");
return name+"早上好,现在时间是:"+new Date();
}
}
public static void main(String[] args) {
Endpoint.publish("http://localhost:9999/hello",new HelloWorld());
System.out.println("服务器已启动!");
}
B、查看wsdl结果--服务描述语言,描述我们所发布的服务的详细信息
http://localhost:9999/hello?wsdl
C、wsimport 生成Java客户端调用WebService的源代码(只需要一个wsdl文件即可)
wsimport -s . http://localhost:9999/hello?wsdl
D、在java客户端调用WebService
public static void main(String[] args) {
//通过HelloWorldService来获得一个连接到HelloWorld这个Web服务的实例
HelloWorld hello= new HelloWorldService().getHelloWorldPort();
String ret= hello.sayHello("test");
System.out.println("结果:"+ret);
}
3、基于Java1.6_20以前的版本来发布WebService
/**
* 基于JDK1.6_20以前的版本,在标注WebService的时候,写的注解更加详尽一点
* @author Administrator
*
*/
@WebService(targetNamespace="http://localhost:999/myservice")
@SOAPBinding(style=Style.RPC)//只支持RPC的消息风格
public class Service2 {
@WebMethod
public String test(String msg) {
System.out.println(msg);
return msg + " form the Server!";
}
}
4、小结
WebService叫Web服务--基于Web(htttp)协议提供的一种服务。是可以跨平台跨语言调用。他会以一个URI暴露出去。
广义的WebService,所有在Web服务器中运行的应用,只要能通过一个uri来访问,都可以认为是一个WebService.
标准的WebService,是使用WSDL语言来描述调用的接口信息,基于SOAP协议(基于XMl协议)来传递调用的信息的一种Web应用.
xml+wsdl+soap
学习websrvice的内容
A、webService的服务器端如何编程实现.
(1)、直接JAVA中自带的Endpoint.publish()来发布;
(2)、在web应用中嵌入webservice服务器(其实是web服务器中的一个应用,专门用来处理webservice请求的)。
B、如何去调用别人的WebService
(1)、直接使用wsimport来生成java的客户端.
(2)、自己写程序发送http请求,发送符合SOAP协议的请求体去调用webService。
(3)、利用等三方框架
二、WebService调用通信细节
1、WebService调的过程
A、第一次请求
GET /hello?wsdl HTTP/1.1
User-Agent: Java/1.6.0_10
Host: localhost
Accept: text/html,image/gif,image/jpeg,*; q=.2,*/*; q=.2
Connection: keep-alive
B、第一次请求的响应
HTTP/1.1 200 OK
transfer-encoding: chunked
Content-type: text/xml;charset="utf-8"
<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><deFinitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://itcast.gz/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://itcast.gz/" name="HelloWorldService">
<types>
<xsd:schema>
<xsd:import namespace="http://itcast.gz/" schemaLocation="http://localhost/hello?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="sayHello">
<part name="parameters" element="tns:sayHello"></part>
</message>
<message name="sayHelloResponse">
<part name="parameters" element="tns:sayHelloResponse"></part>
</message>
<portType name="HelloWorld">
<operation name="sayHello">
<input message="tns:sayHello"></input>
<output message="tns:sayHelloResponse"></output>
</operation>
</portType>
<binding name="HelloWorldPortBinding" type="tns:HelloWorld">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
<operation name="sayHello">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="HelloWorldService">
<port name="HelloWorldPort" binding="tns:HelloWorldPortBinding">
<soap:address location="http://localhost/hello"></soap:address>
</port>
</service>
</deFinitions>
C、第二次请求
发送的是POST请求,并且有请求体,请求体中的内容Content-Type是text/xml; charset=utf-8。请求体是一个基于SOAP协议的确xml文档。
POST /hello HTTP/1.1
SOAPAction: ""
Accept: text/xml,multipart/related,text/html,*/*; q=.2
Content-Type: text/xml; charset=utf-8
User-Agent: Java/1.6.0_10
Host: localhost
Connection: keep-alive
Content-Length: 194
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:sayHello xmlns:ns2="http://itcast.gz/"><arg0>itcast</arg0></ns2:sayHello></S:Body></S:Envelope>
D、第二次响应,响应的也是xml文件,XMl文件的内容就是调用结果,是基于SOAP协议封装的xml文档。
HTTP/1.1 200 OK
transfer-encoding: chunked
Content-type: text/xml;charset="utf-8"
5e
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body>
b2
<ns2:sayHelloResponse xmlns:ns2="http://itcast.gz/"><return>itcast早上好,现在时间是:Sun Jan 15 14:35:33 CST 2012</return></ns2:sayHelloResponse></S:Body></S:Envelope>
三、熟悉wsdl
三、熟悉wsdl
1、wsdl语法简介
2、webservice注解
WebService的注解包括:
@WebService-定义服务--定义服务的总体信息,比如有哪些prottype,服务的名称,服务的类型等等。
@WebMethod-定义方法---定义方法的名称以及是否作为webService发布出去
@WebResult-定义返回值--
@WebParam-定义参数--定义方法调用参数的名称等信息。
3、WebService客户端代码简化
public class ClientTest {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
URL url = new URL("http://localhost:9999/hello?wsdl");
//根据服务器端wsdl文件,创建一个客户端Service组件,相当于引用服务器webservice
Service service= Service.create(url,new QName("http://itcast.gz/","HelloWorld2Service"));
//getPort是从WebService服务中获得一个组件(port)
HelloWorld2 hs= service.getPort(new QName("http://itcast.gz/","HelloWorld2Port"),HelloWorld2.class);
//运行即可
String ret=hs.sayHello("ddd");
System.out.println("返回的结果:"+ret);
}
@WebService(name = "HelloWorld2",targetNamespace = "http://sanfy.cn/")
@XmlSeeAlso({
})
public interface HelloWorld2 {
/**
*
* @param arg0
* @return
* returns java.lang.String
*/
@WebMethod
@WebResult(targetNamespace = "")
@RequestWrapper(localName = "sayHello",targetNamespace = "http://sanfy.cn/",className = "cn.sanfy.SayHello")
@ResponseWrapper(localName = "sayHelloResponse",className = "cn.sanfy.SayHelloResponse")
public String sayHello(
@WebParam(name = "arg0",targetNamespace = "")
String arg0);
}
四、SOAP协议简介
1编程访问WebService
public static void main(String[] args) throws Exception {
URL url=new URL("http://localhost:9999/hello");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
//设置请求头信息
conn.setRequestProperty("SOAPAction:","");
conn.setRequestProperty("Accept","text/xml,*/*; q=.2");
conn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
OutputStream out= conn.getoutputStream();
out.write("<?xml version=\"1.0\" ?><S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body><ns2:listUsers xmlns:ns2=\"http://baidu.com\"/></S:Body></S:Envelope>".getBytes());
out.close();
System.out.println("调用得到的结果:");
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line+"\r\n");
}
br.close();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。