使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务-3方法
 
- UID
- 1066743
|

使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务-3方法
方法HTTP 方法映射到资源的 CRUD(创建、读取、更新和删除) 操作。尽管您可以做一些小修改,比如让 PUT 方法变成创建或更新,但基本的模式如下:
- HTTP GET:获取/列出/检索单个资源或资源集合。
- HTTP POST:新建资源。
- HTTP PUT:更新现有资源或资源集合。
- HTTP DELETE:删除资源或资源集合。
因为我已经介绍过 GET 方法,我将从 POST 开始说明。就像其他方法一样,我仍然使用 Contact 示例进行说明。
POST通常通过填写表单创建新联系人。也就是说,HTML 表单将 POST 到服务器,服务器创建并维护新创建的联系人。清单 5 演示了该操作的服务器端逻辑。
清单 5. 接受表单提交(POST)并新建一个联系人1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| @POST
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void newContact(
@FormParam("id") String id,
@FormParam("name") String name,
@Context HttpServletResponse servletResponse
) throws IOException {
Contact c = new Contact(id,name,new ArrayList<Address>());
ContactStore.getStore().put(id, c);
URI uri = uriInfo.getAbsolutePathBuilder().path(id).build();
Response.created(uri).build();
servletResponse.sendRedirect("../pages/new_contact.html");
}
|
注意该示例的以下部分:
- @Consumes:声明该方法使用 HTML FORM。
- @FormParam:注入该方法的 HTML 属性确定的表单输入。
- @Response.created(uri).build(): 构建新的 URI 用于新创建的联系人(/contacts/{id})并设置响应代码(201/created)。您可以使用 http://localhost:8080/Jersey/rest/contacts/<id> 访问新联系人。
PUT我使用 PUT 方法更新现有资源。但是,也可以通过更新实现,或者像清单 6 中的代码片段展示的那样创建一个资源。
清单 6. 接受 PUT 请求并创建或更新联系人1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| @PUT
@Consumes(MediaType.APPLICATION_XML)
public Response putContact(JAXBElement<Contact> jaxbContact) {
Contact c = jaxbContact.getValue();
return putAndGetResponse(c);
}
private Response putAndGetResponse(Contact c) {
Response res;
if(ContactStore.getStore().containsKey(c.getId())) {
res = Response.noContent().build();
} else {
res = Response.created(uriInfo.getAbsolutePath()).build();
}
ContactStore.getStore().put(c.getId(), c);
return res;
}
|
我还在本示例中包含了许多不同的概念,重点强调以下概念:
- Consume XML:putContact() 方法接受 APPLICATION/XML 请求类型,而这种输入 XML 将使用 JAXB 绑定到 Contact 对象。您将在下一节中找到客户端代码。
- 空响应带有不同的状态码:PUT 请求的响应没有任何内容,但是有不同的状态码。如果数据存储库中存在联系人,我将更新该联系人并返回 204/no content。如果没有新联系人,我将创建一个并返回 201/created。
DELETE实现 DELETE 方法非常简单。示例请查看清单 7。
清单 7. 删除其 ID 确定的联系人1
2
3
4
5
6
| @DELETE
public void deleteContact() {
Contact c = ContactStore.getStore().remove(contact);
if(c==null)
throw new NotFoundException("No such Contact.");
}
|
表示形式在上一节中,我介绍了几个表示形式类型。现在我将简要浏览一遍并深入探讨 JAXB 表示形式。其他受支持的表示形式有 byte[]、InputStream、File 等。
- String:纯文本。
- Response:一般 HTTP 响应,包含带有不同响应代码的定制内容。
- Void:带有 204/no content 状态码的空响应。
- Resource Class:将流程委托给该资源类。
- POJO:使用 @XmlRootElement 注释的 JavaBean,这让它成为一个 JAXB bean,可以绑定到 XML。
- POJO 集合:JAXB bean 集合。
JAX-RS 支持使用 JAXB (Java API for XML Binding) 将 JavaBean 绑定到 XML 或 JSON,反之亦然。JavaBean 必须使用 @XmlRootElement 注释。清单 8 使用 Contact bean 作为示例。没有明确 @XmlElement 注释的字段将包含一个名称与之相同的 XML 元素。清单 9 显示了用于一个 Contact bean 的序列化 XML 和 JSON 表示形式。联系人集合的表示形式与此相同,默认使用 <Contacts> 作为包装器元素。
清单 8. Contact bean1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| @XmlRootElement
public class Contact {
private String id;
private String name;
private List<Address> addresses;
public Contact() {}
public Contact(String id, String name, List<Address> addresses) {
this.id = id;
this.name = name;
this.addresses = addresses;
}
@XmlElement(name="address")
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
// Omit other getters and setters
}
|
清单 9. 一个 Contact 的表示形式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| XML representation:
<contact>
<address>
<city>Shanghai</city>
<street>Long Hua Street</street>
</address>
<address>
<city>Shanghai</city>
<street>Dong Quan Street</street>
</address>
<id>huangyim</id>
<name>Huang Yi Ming</name>
</contact>
JSON representation:
{"contact":[{"address":[{"city":"Shanghai","street":"Long
Hua Street"},{"city":"Shanghai","street":"Dong Quan
Street"}],"id":"huangyim","name":"Huang Yi Ming"}]}
|
对于使用 JAXB 的更高主题,请查看 中的项目主页。 |
|
|
|
|
|