Board logo

标题: 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务-3方法 [打印本页]

作者: look_w    时间: 2018-8-23 20:54     标题: 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务-3方法

方法HTTP 方法映射到资源的 CRUD(创建、读取、更新和删除) 操作。尽管您可以做一些小修改,比如让 PUT 方法变成创建或更新,但基本的模式如下:
因为我已经介绍过 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");
}




注意该示例的以下部分:
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;
}




我还在本示例中包含了许多不同的概念,重点强调以下概念:
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 等。
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 的更高主题,请查看  中的项目主页。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0