1,根据上节末尾说的,将soap1.2的注解去掉后,变成1.1,客户端同样可以发送成功。
再将soap1.2的注解加上,再访问,那么客户端发送的是1.1的请求还是1.2的请求呢?
答案是会发送1.1的请求,因为他并不聪明,在无法明确是1.1还是1.2的时候,它都会发送1.1的请求,因为发送1.1的请求,无论服务端是1.1还是1.2,都可以接收。
如何设置客户端请求时使用的soap协议?
通过SoapBindingConfiguration类搞定。客户端实现细节如下:
public class Client { public static void main(String[] args) { JaxWsProxyfactorybean bean = new JaxWsProxyfactorybean(); //设置soap协议。通过SoapBindingConfiguration, SoapBindingConfiguration soap = new SoapBindingConfiguration(); //SoapVersion是一个接口,ctrl+t何以查看继承树,得知有两个实现类,Soap11,Soap12 SoapVersion sv = Soap12.getInstance(); //给这个绑定设置版本 soap.setVersion(sv); //将绑定配置到请求bean中。 bean.setBindingConfig(soap); bean.setAddress("http://192.168.0.104:8989/hello?wsdl"); bean.setServiceClass(IHelloWorld.class); IHelloWorld world = (IHelloWorld) bean.create(); String s = world.sayHello(); System.out.println(s); } }
2,RESTfull
RESTfull是基于jax-rs的webservice,它及支持XML也支持JSON,Jax-rs是JavaEE6引入的一个新技术。
Jax-rs即java api for RESTfull Web Service的缩写,是一个Java编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建web服务。Jax-rs使用了JavaSE5引入的Java标准来简化web服务的客户端和服务端的开发和部署。
JAX-RS提供了一些标注将一些资源类,一个POJOjava类封装为WEB资源。标注包括:
(1)如果要将服务方法以restfull方式发布,需要给工程添加jsr311.jar(支持jsr)和jettison-1.3.jar(解析JSON)。
(2)添加了以上两个jar包后,就可以开发服务端了。新建一个包,cn.itcast.rs,在这个包中建立一个HelloWorld.java文件,编写这个java文件。
import javax.ws.rs.GET; import javax.ws.rs.Path; import org.apache.cxf.jaxrs.JAXRSServerfactorybean; @Path(value="/two/")//设置访问路径 public class HelloWorld { @GET //以get方式访问这个方法。将sayHello方法发布。 //设置访问路径,如果这样设置,路径是:http://localhost:8080/two/say/ @Path(value="/say/") public void sayHello() { System.out.println("Hello restfull!!!"); } public static void main(String[] args) { JAXRSServerfactorybean bean = new JAXRSServerfactorybean(); bean.setAddress("http://192.168.0.104:8080");//后面没有斜杠 bean.setServiceBean(new HelloWorld()); //开启 bean.create(); } }
(3)发布服务,在浏览器地址栏访问:http://192.168.0.104:8080/two?_wadl&_type=xml
返回204是占位访问的意思。那么如何访问呢?
直接在地址栏输入http://192.168.0.104:8080/two/say即可。
(4)如何在请求中添加参数呢?使用注解!
如下设置:
在方法前的@Path中的路径后面添加一个{name}表示接受name参数,sayHello方法需要一个nm参数,但我们接收的是一个name参数,可以通过在参数前添加@PathParam注解来映射。
再访问http://192.168.0.104:8080/two?_wadl&_type=xml,可以看到如下变化:
带有参数的访问可以通过如下形式访问:http://192.168.0.104:8080/two/say/xzm
表示访问say方法,并传递xzm参数给这个方法。可以看到控制台打印:
(5)使发布的方法返回xml格式的数据,
本例返回一个user对象。
需要为User类加上注解,表明是xml格式数据,
//通过@XmlRootElement(name="user")可以定义xml文档的根元素是<user> @XmlRootElement(name="user") public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
开发服务:
@Path(value="/two/") @Produces(value={"application/xml"}) // 返回xml格式数据 public class HelloXZM { @GET @Path(value="/get/{name}") public User getUser(@PathParam("name") String nm) { User user = new User(); user.setName("xzm"+nm); user.setAge(22); return user; } public static void main(String[] args) { JAXRSServerfactorybean bean = new JAXRSServerfactorybean(); bean.setAddress("http://192.168.0.104:8080"); bean.setServiceBean(new HelloXZM()); bean.create(); } }
在浏览器访问http://192.168.0.104:8080/two/get/xuzhimin,会将xuzhimin作为参数传递给getUser方法。
看到如下内容:
(6)获取JSON格式数据,获取JSON格式的服务方法必须返回一个Javabean。
修改这个注解即可:
@Produces(value={"application/json"}) 示例: User类就是用刚才定义的User。 服务类的开发: @Path(value="/json/") @Produces(value="application/json") public class HelloJson { @GET @Path(value="/get/{name}") public User getJson(@PathParam("name") String nm) { User user = new User(); user.setAge(23); user.setName(nm); return user; } public static void main(String[] args) { JAXRSServerfactorybean bean = new JAXRSServerfactorybean(); bean.setAddress("http://192.168.0.104:8080"); bean.setServiceBean(new HelloJson()); bean.create(); } }
在浏览器访问http://192.168.0.104:8080/json/get/xiaoqiang
(7)如果不能知道用户需要那种格式,可以定义两种格式,用逗号隔开。
@Produces(value={"application/json","application/xml"})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。