JAVA的 WebService规范 JAX-RS(二)

2014-11-24 08:42:01 · 作者: · 浏览: 1
ion;
import java.text.SimpleDateFormat;
public class StudentServiceImpl implements IStudentService {
public Student getStudent(long id, String name) {
Student s = new Student();
s.setId(id);
s.setName(name);
try {
s.setBirthday(new SimpleDateFormat("yyyy-MM-dd")
.parse("1983-04-26"));
} catch (ParseException e) {
e.printStackTrace();
}
return s;
}
public Student getStudent(String name) {
Student s = new Student();
s.setId(1);
s.setName(name);
try {
s.setBirthday(new SimpleDateFormat("yyyy-MM-dd")
.parse("1983-04-26"));
} catch (ParseException e) {
e.printStackTrace();
}
return s;
}
}
package JAXRS;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Student")
public class Student {
private long id;
private String name;
private Date birthday;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
因为最终的产出结果是XML,因此你需要对返回值Student 使用JAXB 注解,这样CXF 才会知道如何转换。
发布REST 服务(Jetty):
访问REST 风格的Web 服务很简单,你完全不需要像SOAP 使用SDK 生成客户端代码,因为REST 完全依赖HTTP 协议, 从这里可见REST 是轻量级的。我们访问http://127.0.0.1:335/ws/services/student/1/info name=Andrew Lee 地址,可以看见页面如下所示:
我们看到Web 服务访问成功,当然这个响应的XML 客户端通常要接到并处理,所以你可以用((HttpURLConnection)new URL(“***”).openConnection()).getInputStream()获取,然后使用程序处理这个接收到的结果。为了更加好的使用HTTP 访问REST 服务,推荐你使用Apache HttpComponents-Client 组件进行HTTP 操作,因为这里使用的示例是GET 方法的请求,你是用URL 直接访问或者使用java.net.URL 类来访问很容易,但是如果Web 服务的方法使用@PUT 等注解,那么你就需要费一番头脑来在请求报头中加入要请求的方法类型等信息,这些是很繁琐的事情。HTTP-Client 的访问代码如下所示:
package JAXRS;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class RestClient {
public static void main(String[] args) throws ClientProtocolException,IOException {
HttpGet get = new HttpGet("http://127.0.0.1:335/student/info2 name=Fetion");
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(get);
InputStream ins = response.getEntity().getContent();
byte[] b = new byte[1024];
StringBuilder sb = new StringBuilder();
while (ins.read(b) != -1) {
sb.append(new String(b, "UTF-8"));
}
System.out.println(sb.toString());
}
}
注意上面只是简单示例,使用的是逐个字节读入的方式,因此最好不要在输出的XML 中出现非ISO-8859-1 的字符。如果公开的Web 服务是PUT 方法,那么你可以使用HttpPut 类来完成处理。CXF 中的JAX-WS 的一些设置对于JAX-RS 也同样有效,例如日志拦截器,但不是所有的
都可以使用,例如:后面讲到的WSS4J 的拦截器就不能使用到JAX-RS 上,因为WS-*是SOAPWeb 服务的相关规范。下面是服务端被访问时输出的日志信息:
2009-6-23 21:55:05 org.apache.cxf.interceptor.LoggingInInterceptor
logging
信息: Inbound Message
----------------------------
ID: 1
Address: /ws/services/student/info2
Encoding: UTF-8
Content-Typ