微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!
RestEasy开发WebService一
1.搭建RestEasy项目
基于resteasy版本:2.2.1.GA
使用maven2.2.1作为构建和依赖管理工具
1.创建工程,配置pom.xml
mvn archetype:create -DgroupId=com.longtask.rest.easyrest -DartifactId=easyrest -DarchetypeArtifactId=maven-archetype-webapp
mvn eclipse:eclipse
注:使用m2eclipse插件可直接import
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- modelVersion>4.0.0</>
- groupId>rest.resteasyartifactId>rest-resteay-demopackaging>warversion>1.0name>rest-resteay-demo Maven Webappurl>http://maven.apache.orgrepositories repository id>java.net >http://download.java.net/maven/1layout>legacy >maven repo>http://repo1.maven.org/maven2/
- >jboss>jboss repo>http://repository.jboss.org/nexus/content/groups/public/ dependenciesdependency>org.jboss.resteasy>resteasy-jaxrs>2.2.1.GA
- exclusions exclusion >commons-httpclient >javax.servlet>servlet-api>javax.xml.bind>jaxb-api>com.sun.xml.bind>jaxb-impl
- >resteasy-jettison-provider>javax.xml.stream>stax-api >junit >3.8.1scope>test buildfinalNamepluginsplugin>org.apache.maven.plugins>maven-compiler-pluginconfigurationsource>1.6targetproject>
这个不是重点:看不懂这个pom.xml没关系,也就是下载依赖包,打包,先继续往下看
2.编写jax-rs的服务类
package resteasy.server;
-
- import javax.ws.rs.GET;
- import javax.ws.rs.Path;
- import javax.ws.rs.PathParam;
- @Path(value = "echo")
- public class Echo {
- @GET
- @Path(value = "/{message}")
- public String echoService(@PathParam("message") String message)
- {
- return message;
- }
- }
@Path表示开启访问这个资源的路径
@GET表示响应HTTP 的get方法
@PathParam表示引用URI中得参数
3.web.xml的配置
<!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd" web-appcontext-paramparam-name>resteasy.resourcesparam-value>resteasy.server.Echo listenerlistener-class org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
- servletservlet-name>Resteasyservlet-class org.jboss.resteasy.plugins.server.servlet.HttpServletdispatcher
- servlet-mappingurl-pattern>/*配置响应的listener和servlet无非就是初始resteasy的服务
(先简单理解)
3.打包部署到响应的servlet容器即可(如tomcat),然后访问http://localhost:8080/rest-resteay-demo/echo/hello,world,网页上出现hello,world则成功
hello,world可换成任意字符,同样也将返回响应的字符
注:如果不使用maven,则可以到resteasy官网下载响应jar包即可
1.使用的 ServletContextListener 来初始化并发布我们的服务类
span style="color:#000000;"> <!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd" >
- >
- >
- >
- > org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap >
- > > org.jboss.resteasy.plugins.server.servlet.HttpServletdispatcher >span>
这是第一波中得web.xml,也就是用的listener来进行的服务发布:
查看源代码可以发现public class ResteasyBootstrap implements servletcontextlistener,其实现了servletcontextlistener 接口,通过获取
>
如上参数进行了服务类的加载.
resteasy.resources
代表通过指定资源类的全路径名进行加载,有多个资源类可通过逗号分开
查看官方文档可以发现其他用于加载资源类的参数
resteasy.scan.resources 默认值:false 用途:设置为ture时,将自动搜索 WEB-INF/lib下面的 jars 和 WEB-INF/classes目录中有(@GET @POST ...)注解的class并注册为服务 |
可用上一波的例子替换相应参数进行测试(亲测木有问题)
2.使用 servlet Filter 注册服务类web.xml如下
<!DOCTYPE web-app PUBLIC
-
- >
-
- >
- org.jboss.resteasy.plugins.server.servlet.HttpServletdispatcher
- init-param>javax.ws.rs.Application>resteasy.server.MyApplication>
如上
代码,我们发现相比前面例子去掉了listener,在servlet中多
添加了
一个
javax.ws.rs.Application
这是一个抽象类,是一个jax rs的标准规范,允许通过其子类注册你得资源类请看MyApplication代码
package resteasy.server;
- import java.util.HashSet;
- import java.util.Set;
-
- import javax.ws.rs.core.Application;
- class MyApplication extends Application{
- Set<Object> objectSet = new HashSet<Object>();
- Set<Class<?>> classSet = new HashSet<Class<?>>();
-
- public MyApplication()
- {
- objectSet.add(new Echo());
-
- }
- @Override
- public Set<Class<?>> getClasses() {
-
- return classSet;
- }
- public Set<Object> getSingletons() {
- return objectSet;
-
- }
通过构造函数添加了一个Echo的资源类实例,当然也可通过添加一个class来实现,二者选其一即可
3.使用 filter 注册服务类(也就是资源类)
作为servlet进行资源的注册,你会发现不能将静态文件(html,images)注册为资源,所以resteasy还提供了filter进行资源的注册,不妨碍其获取静态文件
继续引用上一个例子,只用修改其web.xml如下
copy
filterfilter-namefilter-class org.jboss.resteasy.plugins.server.servlet.Filterdispatcher
- filter-mapping
>
实现文件上传---非form提交方式(实例、教程)
这里指的上传是指利用resteasy来获取:客户端HTTP开发包发送的body请求-----刚开始也没撒头绪,第一时间去google,发现有哥们问同样的问题,但是却没有解决方法,于是乎就只有硬着头皮看英文文档,发现如下文档:
The @Context annotation allows you to inject instances of javax.ws.rs.core.HttpHeaders,javax.ws.rs.core.UriInfo,javax.ws.rs.core.Request,javax.servlet.HttpServletRequest,javax.servlet.HttpServletResponse,javax.servlet.ServletConfig,javax.servlet.ServletContext,and javax.ws.rs.core.SecurityContext objects.
翻译下呢就是说使用@Context 注解就可以将 javax.ws.rs.core.HttpHeaders,and javax.ws.rs.core.SecurityContext等等实例注入到变量中
server端resource类代码如下:
@PUT
- @Path(value = "/{folder}/{fileName}")
- public Response uploadFile(@PathParam("folder") String folder,@PathParam("fileName") String fileName, @Context HttpServletRequest request)
- {
- File f = new File("x:\\"+fileName);
- InputStream is = null;
- try {
- is = request.getInputStream();
- FileUtils.copyInputStreamToFile(is, f);
- } catch (IOException e) {
- // Todo Auto-generated catch block
- e.printstacktrace();
- }
- return Response.ok().build();
- }
请主要看下以上代码红色部分,就相当于把HttpServletRequest请求注入到了request变量中,那么通过request对象获取获取输入流,则得到了body主体部分的数据。
客户端的代码如下
copy
String urlResouce = "http://localhost:8080/cloud-storeage-boss/muluSDF/xyz.png"; // create URL
- File localFile = new File("C:\\Users\\maomao\\Pictures\\2.png");
- try{
-
- HttpURLConnection urlConnection =
- (HttpURLConnection) (new URL(urlResouce)).openConnection();
- urlConnection.setDoInput(true);
- urlConnection.setDoOutput(true);
- urlConnection.setRequestMethod("PUT");
- OutputStream urlOutputStream = urlConnection.getoutputStream();
- FileInputStream fileInputStream = new FileInputStream(localFile);
- IoUtils.copy(fileInputStream, urlOutputStream);
- fileInputStream.close();
- urlOutputStream.close();
- System.out.println(urlConnection.getResponseCode());
- }
- catch(Exception e)
- {
- e.printstacktrace();
- }
通过此客户端的调用,就可以将本地的2.png文件上传到服务器,并被保存为xyz.png.
resteasy与spring真正集成发布我们的restful webservice 服务(实例、教程)
原本以为根据文档集成resteasy与spring很简单,但是却还是花费的一定时间,避免大家走弯路----现在网上有的相关的集成都只是,spring加入进项目,木有与resteasy真正集成
老规矩,先上MAVEN的配置文件中依赖包:
>
-
- >
-
-
-
- >resteasy-spring
- <!-- JAXB support -->
- >resteasy-jaxb-provider
- <!-- spring -->
- >org.springframework>spring >2.5.6.SEC03 >
注意上图中得resteasy-spring模块依赖,和spring依赖
resteasy-spring直接配置似乎不能自动下载,如果不行可以自己去官网下载然后安装到私服仓库
还有spring的依赖必须是要有的,resteasy-spring只是提供集成代码
2.关键的web.xml中得配置
<!DOCTYPE web-app PUBLIC
-
- display-name>Archetype Created Web Application>contextConfigLocation>classpath*:applicationContext*.xml <!--
- >
- >resteasy.scan.resources>true -->org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener>org.jboss.resteasy.plugins.server.servlet.HttpServletdispatcher
- >
相比原来的配置文件多了
>
和
>
3.application.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
- beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">
-
- bean id="testServicePoint" class="com.jd.interfacce.service.point.TestServicePoint"property name="manager" ref="manager" />
- bean<!-- MANAGER -->
- bean id="manager" class="com.jd.interfacce.manager.impl.ManagerImpl"/>
- beans>
其中
testServicePoint
是我们的资源resouce也就是发布接口的类
4.资源类
package com.jd.interfacce.service.point;
- import javax.ws.rs.GET;
- import javax.ws.rs.Path;
- import javax.ws.rs.PathParam;
- import com.jd.interfacce.manager.Manager;
- /**
-
- * @author
- *
- */
- @Path(value = "/")
- class TestServicePoint {
- Manager manager;
- @GET
- @Path(value = "/echo/{message}")
- public String getMessage(@PathParam(value = "message") String message)
- {
- // return message;
- return manager.getMessage(message);
- }
- public Manager getManager() {
- return manager;
- void setManager(Manager manager) {
- this.manager = manager;
- }
- }
5.manager类
package com.jd.interfacce.manager.impl;
- class ManagerImpl implements Manager{
- @Override
- public String getMessage(String message)
- return message;
- }
利用resteasy框架构建rest webservice----第五波:java代码调用乱码解决方案
今天主要介绍下当URI中出现中文时,服务端获取出得Pathparam为乱码的问题:
String urlResouce = null;
- try {
- urlResouce = "http://10.28.0.203:8080/cloud-storeage-boss/cai:dafile/"+URLEncoder.encode("中文eclipse.zip","utf-8");
- } catch (UnsupportedEncodingException e1) {
-
- e1.printstacktrace();
- }
- File localFile = new File("Z:\\tools\\eclipse-jee-helios-SR2-win32.zip");
- try{
-
- HttpURLConnection urlConnection =
- (HttpURLConnection) (new URL(urlResouce)).openConnection();
- urlConnection.setRequestProperty("Charset", "UTF-8");
- urlConnection.setRequestProperty("auth", "maomaocaicai");
- urlConnection.setDoInput(true);
- urlConnection.setDoOutput(true);
- urlConnection.setRequestMethod("PUT");
- OutputStream urlOutputStream = urlConnection.getoutputStream();
- FileInputStream fileInputStream = new FileInputStream(localFile);
- fileInputStream.close();
- urlOutputStream.close();
- System.out.println(urlConnection.getResponseCode());
- }
- catch(Exception e)
- {
- e.printstacktrace();
- }
乱码参数的解决方法很简单,就是将相应URI进行UTF-8的编码
这个原理比较简单因为中文时两个字节,而在网络进行传输的时候由于某种原因(具体原因就是编码的问题,请google)会进行单字节的编码,解析出来的中文就变乱码了。----浏览器在传输的时候都会对中文进行编码传输
/**
- * 下载对象
- * @param bucketName
- * @param objectName
- * @param request
- * @return
- */
- @Path(value = "/{bucketName}/{objectName}")
- @Produces(MediaType.APPLICATION_OCTET_STREAM)
- public Response downloadobject(@PathParam(value = "bucketName") String bucketName,@PathParam(value = "objectName") String objectName,100); background-color:inherit">@Context HttpServletRequest request)
- Bucketobject bucketobject = objectManager.downloadobject(request.getHeader(CommonConstant.USER_TOKEN),CommonsUtil.generateSummary(request), bucketName, objectName);
- //直接返回输出流
- return Response.ok(new BigFileOutputStream(bucketobject.getDataStream())).build();
这段代码比较简单:重点关注响应的实体类BigFileOutputStream,其传入的构造参数是一个输入流
该类的具体实现如下,其实关键的需要实现javax.ws.rs.core.StreamingOutput类,重写其write方法,将你得数据输出到write方法中得输出流中即可,resteasy框架会将其流直接输出到客户端
* 实现用于直接响应一个输出流
- * @author maomao
- *
- */
- class BigFileOutputStream implements javax.ws.rs.core.StreamingOutput {
- private InputStream inputStream;
- public BigFileOutputStream(){}
- public BigFileOutputStream(InputStream inputStream)
- this.inputStream = inputStream;
- void write(OutputStream output) throws IOException,
- WebApplicationException {
-
- IoUtils.copy(inputStream, output);
- public InputStream getInputStream() {
- return inputStream;
- void setInputStream(InputStream inputStream) {
- }
客户端调用代码如下
//下载文件
- private void downLoadobject()
- {
- String bucket = "EBoxTEST123456";
- String objectName = "wangpan114daitupian.png";
- String urlResouce = bucket + "/" + objectName;
- String baseURL = "http://10.28.1.37:8080/application_interface_manager/platform/";
- String hostURL = baseURL + urlResouce ;
- String httpMethod = "GET";
- String requestDate = new Date().toString();
- new File("x:\\1142.png");
- //生成摘要用于签名
- String summary = httpMethod + "\n"
- + "\n"
- + "\n"
- + requestDate + "\n"
- + urlResouce;
-
- String clientToken = new CreateSignTokenImpl().getToken(summary,secretKey);
- HttpURLConnection urlConnection =
- (HttpURLConnection) (new URL(hostURL)).openConnection();
- urlConnection.setRequestProperty("Token", "jingdong "+accessKey+":"+clientToken);
- urlConnection.setRequestProperty("Date", requestDate);
- urlConnection.setDoInput( urlConnection.setRequestMethod(httpMethod);
- InputStream is = urlConnection.getInputStream();
- // FileUtils.copyInputStreamToFile(is, localFile);
- OutputStream op = new FileOutputStream(localFile);
- byte [] bts = new byte[1024];
- int n = 0;
- while(-1 != (n = is.read(bts)))
- {
- op.write(bts, 0, n);
- }
- // op.close();
- } catch (IOException e1) {
- // Todo Auto-generated catch block
- e1.printstacktrace();
- System.out.println(urlConnection.getResponseCode());
- e.printstacktrace();
- }
其实看着复杂,实际上很多代码不重要(偷懒把项目客户端调用代码直接copy过来了),关键就是从HttpUrlConnect处获取输入流(即是服务端输出流输出的数据),将其写入到文件即可
我的Demo
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.service</groupId>
<artifactId>RestEasyDemo1</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>RestEasyDemo1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- RestEasy的Maven依赖 -->
<!-- core library -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.2.1.GA</version>
</dependency>
<!-- optional modules -->
<!-- JAXB support -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>2.2.1.GA</version>
</dependency>
<!-- 添加json的支持 -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>2.2.1.GA</version>
</dependency>
<!-- multipart/form-data and multipart/mixed support -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>2.2.1.GA</version>
</dependency>
</dependencies>
<build>
<finalName>RestEasyDemo1</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat6-maven-plugin</artifactId>
<version>2.0</version>
</plugin>
</plugins>
</build>
</project>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- Auto scan REST service -->
<!-- 自动扫描Service类会报错,这是一个bug,推荐使用手动的 -->
<!-- <context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param> -->
<!-- 手动注册Service类 -->
<context-param>
<param-name>resteasy.resources</param-name>
<param-value>com.easytest.service.Library,com.easytest.service.MessageRestService</param-value>
</context-param>
<!-- this need same with resteasy servlet url-pattern -->
<!-- <context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param> -->
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletdispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
服务类:
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import org.jboss.resteasy.annotations.GZIP;
import org.jboss.resteasy.annotations.providers.multipart.PartType;
import org.omg.IOP.MultipleComponentProfileHelper;
@Path(value = "/captcha")
public class CaptchaService {
/**
* 获取验证码
* @param id
* @return
*/
@GET
@Path(value = "/{reqId}/get.htm")
@GZIP
@Produces("image/png")
public File fehchCaptach(@PathParam("reqId") String reqId){
System.out.println(reqId);
return new File("D:\\testFTP\\suzhou\\00080200201401040007\\tailored\\BIRTH17_00282529128900101.png");
}
/**
* 保存验证码
* @param reqId
* @param captcha
* @return
*/
@POST
@Path(value = "/post.htm")
@Produces("application/json")
public Map<String,String> saveCaptach(@FormParam("reqId") String reqId,@FormParam("captcha") String captcha){
System.out.println(reqId+" = "+captcha);
Map<String,String> map = new HashMap<String,String>();
map.put("reqId",reqId);
map.put("status","true");
map.put("msg","successfully!");
return map;
}
/**
* 反馈某时间段验证码输入情况(正确/错误)
* @param beginDate 开始日期(yyyymmdd)
* @param endDate 截止日期(yyyymmdd)
* @return
*/
@GET
@Path(value = "/{beginDate}/{endDate}/Feedback.htm")
@Produces("application/json")
public List<Map<String,String>> Feedback(@PathParam("beginDate") String beginDate,@PathParam("endDate") String endDate){
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
Map<String,"650fce42dd024983b7e1b6a1a1e0b873");
map.put("result","YES");
list.add(map);
map = new HashMap<String,"25a1df5e9fce4af1bc7f7dcd379d63bb");
map.put("result","cb82aa3387b9489d89bac9f963e5c09c");
map.put("result","NO");
list.add(map);
return list;
}
@GET
@Path(value = "/Feedback/confirm.htm")
public void confirm(@PathParam("beginDate") String beginDate,@PathParam("endDate") String endDate){
}
}
package com.easytest.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import com.easytest.bean.Person;
@Path("/message")
public class MessageRestService {
@GET
@Path("/{param}")
public Response printMessage(@PathParam("param") String msg) {
String result = "Restful example : " + msg;
return Response.status(200).entity(result).build();
}
@GET
@Path("/person/{param}")
@Produces("application/json")
public List<Map<String,String>> getPerson(){
Person p = new Person();
p.setId("1111");
p.setName("Jack");
p.setAge(22);
p.setAddress("浦东");
List<Map<String,String>>();
Map<String,String>();
map.put("id",p.getId() );
map.put("name",p.getName());
map.put("age",p.getAge()+"");
map.put("address",p.getAddress());
map.put("photo",p.getPhoto());
list.add(map);
return list;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。