首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

使用 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 bean
1
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 的更高主题,请查看  中的项目主页。
返回列表