RESTful接口规范是一种类似于AJXA,使用现有技术实现的编码规范,可以理解为RESTful使用HTTP+URI+XML等技术实现的一套规范。目前RESTful的实现有很多种,比如apache的CXF、glassflash的jersey等实现。
下面使用maven+jersey实现RESTful接口
1.J2SE
使用maven可以快速构建jersey项目并引入相关依赖。
package zxyjhb.jerseyDemo;
import com.sun.jersey.api.container.grizzly2.GrizzlyWebContainerFactory;
import org.glassfish.grizzly.http.server.HttpServer;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.UriBuilder;
public class Main {
private static int getPort(int defaultPort) {
//grab port from environment, otherwise fall back to default port 9998
String httpPort = System.getProperty("jersey.test.port");
if (null != httpPort) {
try {
return Integer.parseInt(httpPort);
} catch (NumberFormatException e) {
}
}
return defaultPort;
}
//初始化端口
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost/").port(getPort(9998)).build();
}
public static final URI BASE_URI = getBaseURI();
//启动服务
protected static HttpServer startServer() throws IOException {
final Map<String, String> initParams = new HashMap<String, String>();
//扫描包下的依赖
initParams.put("com.sun.jersey.config.property.packages", "zxyjhb.jerseyDemo");
System.out.println("Starting grizzly2...");
return GrizzlyWebContainerFactory.create(BASE_URI, initParams);
}
public static void main(String[] args) throws IOException {
// Grizzly 2 initialization
HttpServer httpServer = startServer();
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nHit enter to stop it...",
BASE_URI));
System.in.read();
httpServer.stop();
}
}
具体资源类
package zxyjhb.jerseyDemo;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
// The Java class will be hosted at the URI path "/myresource"
@Path("/myresource")
public class MyResource {
// TODO: update the class to suit your needs
// The Java method will process HTTP GET requests
@GET
// The Java method will produce content identified by the MIME Media
// type "text/plain"
@Produces("text/plain")
public String getIt() {
return "Got it!";
}
}
package zxyjhb.jerseyDemo;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import zxyjhb.jerseyDemo.dao.DeviceDao;
import zxyjhb.jerseyDemo.demain.Device;
@Path("/device")
public class DeviceResource {
private DeviceDao deviceDao ;
public DeviceDao getDeviceDao() {
return deviceDao;
}
public void setDeviceDao(DeviceDao deviceDao) {
this.deviceDao = deviceDao;
}
public DeviceResource(){
deviceDao = new DeviceDao();
}
@GET
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Device get(@QueryParam("ip") final String deviceIp){
Device result = null;
if(deviceIp != null){
result = deviceDao.getDevice(deviceIp);
}
return result;
}
@PUT
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Device put(final Device device){
Device result = null;
if(device !=null){
result = deviceDao.updateDevice(device);
}
return result;
}
}
运行结果
Starting grizzly2...
2015-9-11 14:11:02 org.glassfish.grizzly.http.server.NetworkListener start
信息: Started listener bound to [localhost:9998]
2015-9-11 14:11:02 org.glassfish.grizzly.http.server.HttpServer start
信息: [HttpServer] Started.
Jersey app started with WADL available at http://localhost:9998/application.wadl
Hit enter to stop it...
查看WADL
<application xmlns="http://wadl.dev.java.net/2009/02"> <doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.9-ea04 08/05/2011 10:08 AM"/> <grammars/> <resources base="http://localhost:9998/"> <resource path="/device"> <method name="GET" id="get"> <request> <param xmlns:xs="http://www.w3.org/2001/XMLSchema" type="xs:string" style="query" name="ip"/> </request> <response> <representation mediaType="application/xml"/> <representation mediaType="application/json"/> </response> </method> <method name="PUT" id="put"> <request> <representation mediaType="*/*"/> </request> <response> <representation mediaType="application/xml"/> <representation mediaType="application/json"/> </response> </method> </resource> <resource path="/myresource"> <method name="GET" id="getIt"> <response> <representation mediaType="text/plain"/> </response> </method> </resource> </resources> </application>
test接口:
package zxyjhb.jerseyDemo;
import org.glassfish.grizzly.http.server.HttpServer;
import zxyjhb.jerseyDemo.demain.Device;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import junit.framework.TestCase;
/*
* jersey 1.9 写法
*
*/
public class DeviceTest extends TestCase {
private HttpServer httpServer;
private WebResource r;
public DeviceTest(String testName) {
super(testName);
}
@Override
protected void setUp() throws Exception {
super.setUp();
//start the Grizzly2 web container
httpServer = Main.startServer();
// create the client
Client c = Client.create();
r = c.resource(Main.BASE_URI);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
httpServer.stop();
}
public void testGetDevice() {
final String deviceIp = "127.0.0.1";
Device device = r.path("device").queryParam("ip", deviceIp).get(Device.class);
System.out.println(device.toString());
}
public void testPutDevice() {
final Device device = new Device("127.0.0.1","test2");
Device result = r.path("device").put(Device.class, device);
System.out.println(result.toString());
}
}
运行结果:
Starting grizzly2...
2015-9-11 14:13:30 org.glassfish.grizzly.http.server.NetworkListener start
信息: Started listener bound to [localhost:9998]
2015-9-11 14:13:30 org.glassfish.grizzly.http.server.HttpServer start
信息: [HttpServer] Started.
Device [deviceIp=127.0.0.1, deviceStatus=connect]
2015-9-11 14:13:31 org.glassfish.grizzly.http.server.NetworkListener stop
信息: Stopped listener bound to [localhost:9998]
Starting grizzly2...
2015-9-11 14:13:31 org.glassfish.grizzly.http.server.NetworkListener start
信息: Started listener bound to [localhost:9998]
2015-9-11 14:13:31 org.glassfish.grizzly.http.server.HttpServer start
信息: [HttpServer-1] Started.
Device [deviceIp=127.0.0.1, deviceStatus=test2]
2015-9-11 14:13:31 org.glassfish.grizzly.http.server.NetworkListener stop
信息: Stopped listener bound to [localhost:9998]
2.J2EE实现
使用maven构建jersey的webapp项目
生成的web.xml文件,在web.xml文件中配置application
<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e194 -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>zxyjhb.jersey_webapp</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webresources/*</url-pattern>
</servlet-mapping>
</web-app>
具体的资源类
package zxyjhb.jersey_webapp;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
/** Example resource class hosted at the URI path "/myresource"
*/
@Path("/myresource")
public class MyResource {
/** Method processing HTTP GET requests, producing "text/plain" MIME media
* type.
* @return String that will be send back as a response of type "text/plain".
*/
@GET
@Produces("text/plain")
public String getIt() {
return "Hi there!";
}
}
运行结果