corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

REST Web 服务入门

代表性状态传输(REpresentational State Transfer,REST)是一种专门针对分布式超媒体系统的体系结构样式,比如说万维网(World Wide Web)。REST架构的中心思想就是通过统一资源标识符(URI)来识别资源。可以使用标准接口(比如说HTTP)来操作这些资源,并且可以使用这些资源的表示来交换信息。在本教程中,我们首先将学习一些关于REST的知识,然后将讨论 NetBeans IDE 6.1 对这种体系结构风格的支持。

目录

此页面上的内容适用于 NetBeans IDE 6.1



要学习本教程,您需要使用以下技术和资源。

软件或资源

所需版本

NetBeans IDE

Web & Java EE 版本 6.1

Java Developer Kit(JDK)

版本 6 或版本 5

Java EE 兼容的 Web 或应用服务器

Tomcat Web 服务器 6.0 和/或 GlassFish 应用服务器 v2
重要:如果您在本教程中使用,请参阅 NetBeans Wiki on Tomcat with REST

Tomcat 和 GlassFish 都可以与 NetBeans IDE 的 Web & Java EE 发行版一起安装。或者,您可以访问 GlassFish 下载页面Apache Tomcat 下载页面

简介

REST Web 服务即使用 REST 体系结构风格构建的服务。由于其轻量的特性并且支持直接通过 HTTP 传输数据,使用 REST 方式构建 Web 服务作为一种新兴趋势已经开始替代传统的 Web 服务构建方式,即使用基于 SOAP 的技术在互联网上部署服务。

IDE 支持使用 JSR 311(Java API for REST 风格的 Web 服务,JAX-RS)和 Jersey(JAX-RS 的参考实现)快速开发 REST Web 服务。

有关详细信息,请参阅以下内容:

除了构建 REST Web 服务之外,IDE 还支持测试和构建可访问 REST Web 服务的客户机应用程序,并可生成调用 Web 服务的代码(同时支持 REST 和基于 SOAP 的 Web 服务)。

下面列出了 IDE 所提供的 REST 特性:

  1. 通过 JPA 实体类和模式快速创建 REST Web 服务。

  2. 通过拖放 REST 组件面板中的组件快速生成可调用各种 Web 服务的代码,比如说 Google Map、Yahoo News Search 和 StrikeIron Web 服务。

  3. 通过 REST Web 服务生成 JavaScript 客户桩(client stub),用于构建 REST 客户机应用程序。

  4. 生成测试客户机用于测试 REST Web 服务。

  5. 通过逻辑视图方便地导航到项目中的 REST Web 服务实现类。

在本教程中,我们将介绍如何通过 IDE 生成、实现和测试 REST Web 服务。

通过数据库生成实体类

本练习的目标是创建一个项目并通过数据库生成实体类。

  1. 选择“文件”>“新建项目”。在“类别”列表中,选择“Web”。在“项目”列表中,选择“Web 应用程序”并单击“下一步”按钮。

  2. 在“项目名称”字段中,输入 CustomerDB

  3. 在“服务器”列表中,选择一个服务器,如 GlassFish。单击“完成”按钮。

  4. 打开“服务”选项卡。在“数据库”列表中,右键单击“Java DB”并启动它。

  5. 右键单击 CustomerDB 节点并选择“新建”>“从数据库创建实体类”。或者,可以在“新建文件”向导(Ctrl-N)的“持久性”类别中选择它。

  6. 在“数据库表”面板中,从“源”下拉菜单中选择 jdbc/sample 数据源。

    注意:在 Tomcat 上,此数据源可能不存在。在本例中,从“数据源”下拉列表中选择“新建数据源”。这将打开“创建数据源”对话框。在“JNDI 名称”字段中键入 jdbc/sample。从“数据库连接”下拉列表中,选择 jdbc:derby://hostname:1527/sample [app on APP]。单击“确定”按钮。对话框将关闭,您将返回“数据库表”面板。另外参阅 NetBeans IDE 6.0 教程:Tomcat 上的 REST 风格服务

  7. 在“可用表”下,选择 CUSTOMER 并单击“添加”按钮。DISCOUNT_CODE 表(与 CUSTOMER 表有关联)将自动添加到“选定表”列表中。现在您应该看到以下内容:

    通过数据库向导新建实体类向导的数据库表面板,其中选定了 CUSTOMER 和 DISCOUNT_CODE 表

    单击“下一步”按钮。

  8. 在“包”字段中,输入 customerdb。现在您应该看到以下内容:
    通过数据库新建实体类向导的实体类面板,其中显示了包名

  9. 单击“创建持久单元”按钮。将出现以下对话框:
    通过数据库新建实体类向导的创建持久性单元对话框

    单击“创建”按钮,然后单击 Finish 按钮。

  10. 查看“项目”窗口。现在您应该看到以下内容:
    显示了新实体类的项目视图

通过实体类生成 REST 风格的 Web 服务

本练习的目标是使用在上一节中生成的实体类来生成 REST Web 服务。

  1. 右键单击包含实体类原包并选择“新建”> “通过实体类创建 REST Web 服务”。

  2. 在“通过实体类创建 REST Web 服务”向导中,单击“添加所有”按钮。当实体类出现在“选定实体类”字段中之后,单击“下一步”按钮。

  3. 在下一个面板中,保留各选项为默认值,如下图所示:
    通过实体类新建 REST 风格的 Web 服务向导中显示了生成类

    在该界面中,我们可以看到 IDE 将生成的一切内容。IDE 将使用容器-项目模式生成资源类。比如说,对于 Customer 实体类,IDE 将生成一个 CustomersResource 资源类,并生成一个 CustomerResource 项目资源。此外,对于各个资源类,IDE 将生成一个转换器类用于通过相应的实体实例生成资源表示,比如说 CustomersConverter 和 CustomerConverter。而且,另外还有一个称作引用转换器的转换器类(比如说 CustomerRefConverter),可用于表示关系。

    单击“完成”按钮。

  4. 查看“项目”窗口。此时,IDE 应如下所示:
    REST 风格的 Web 服务测试程序登录页面

    “项目”窗口中的 RESTful Web 服务s 节点将显示项目中的所有 REST Web 服务。方括号中间的值,比如说 [/customers/],表示 URI 模板的值。通过双击此节点还可以导航到源代码文件。该视图还显示了所有的 HTTP 方法 和子资源定位器(Sub-resource locator)方法。还是一样,通过双击这些节点可以导航各个方法。

我们已经生成了实体类和 REST Web 服务。接下来,我们将测试应用程序。IDE 提供了一个极具实用性的工具,用于测试 REST Web 服务。我们将在下一节中演示该工具的使用。

测试 REST 风格的 Web 服务

本练习的目标是测试刚才所创建的应用程序。

  1. 右键单击项目节点并选择“测试 REST Web 服务”。此时将会启动服务器并部署应用程序。当部署完成后,浏览器将显示应用程序,其中含有到各 Web 服务的链接:
    REST 风格的 Web 服务测试程序输出显示了数据库中的用户列表

    位于左侧的是根资源集合。此处,它们的名称为 customersdiscountCodes

  2. 首先,选择一个根资源,比如说 customers。单击“方法”下拉列表并选择 GET(application/xml)GET(application/json) 选项。单击“测试”按钮。测试结果将显示在“测试输出”部分中:
    REST 风格的 Web 服务测试程序输出显示了数据库中的用户列表

  3. “测试输出”区域含有 4 个选项卡。Tabular View 是一个平面视图,其中显示了结果文档中的所有 URI。通过单击这些链接可以导航到结果文档中的相应位置。Raw View 视图将显示返回的实际数据。根据所选择的 Mime 类型(application/xmlapplication/json),所显示的数据将分别采用 XML 或 JSON 格式。Headers Tab 将显示 HTTP 报头信息。另一个选项卡是 HTTP Monitor,它显示所发送和接收到的 HTTP 请求及响应。

  4. 退出浏览器并返回 IDE。

添加 Google Map 功能

本练习的目标是在我们的 REST Web 服务中添加 Google 地图功能。

  1. 在编辑器中打开 CustomerResource 类。

  2. 将以下方法添加到 CustomerResource

    @GET
    @ProduceMime("text/html")
    public String getGoogleMap() {
    // Drag and drop the getGoogleMap operation here
    
     return "";
    }
    
    //Gets invoked by going to browser and accessing any customer (ie /customers/1/googleMap)
    /**
     * Returns sub-resource.
     */
    @Path("googleMap/")
    @GET
    @ProduceMime("text/html")
    public String getGoogleMapResource() {
     return getGoogleMap();
    }
  3. 注册 Google map 密钥:http://www.google.com/apis/maps/signup.html。Google map 密钥请求对话框提供了一个网站 URL 字段。在该字段中键入 http://localhost:8080

  4. 在 IDE 中,打开“服务”选项卡并展开“Web 服务”节点。在“Web 服务”下面,展开“Google”节点。然后,再展开“地图服务”节点。

    显示 google map 服务的服务视图

  5. 将 getGoogleMap 项目拖放到您在 步骤 2 中创建的 getGoogleMap 方法的主体的 return = null; 代码行之前。这将打开“定制 getGoogleMap SAAS”对话框。接受默认选项并单击“确定”按钮。

    IDE 将在 CustomerResource 类的 getGoogleMap 方法中添加以下 try 代码块:

    @Path("googleMap/")
    @GET
    @ProduceMime("text/html")
    public String getGoogleMap() {
     try {
    
     String address = "16 Network Circle, Menlo Park";
     java.lang.Integer zoom = 15;
     String iframe = "false";
    
     RestResponse result = GoogleMapService.getGoogleMap(address, zoom, iframe);
     //TODO - Uncomment the print Statement below to print result.
     //System.out.println("The SaasService returned: "+result.getDataAsString());
     } catch (Exception ex) {
    ex.printStackTrace();
     }
     return null;
    }

    IDE 还将在项目中创建以下类和资源:

    • RestConnection � HttpUrlConnection 包装器

    • RestResponse � HTTP 响应包装器

    • GoogleMapServiceAuthenticator � 从 googlemapserviceauthenticator.properties 获取 ApiKey 值的类

    • googlemapserviceauthenticator.properties � 存储 API 密钥的属性文件

    • GoogleMapService � 包含包装器方法的服务包装器,它使用 RestConnection 调用 Google Map 服务。

  1. 将 getGoogleMap 方法的 try 代码块替换为以下内容:

    @Path("googleMap/")
    @GET
    @ProduceMime("text/html")
    public String getGoogleMap() {
     try {
     Customer c = getEntity();
     String address = c.getAddressline1() + " " + c.getAddressline2() + " " +
     c.getCity() + " " + c.getState() + " " + c.getZip();
     java.lang.Integer zoom = 15;
     String iframe = "false";
     
     RestResponse result = GoogleMapService.getGoogleMap(address, zoom, iframe);
     return result.getDataAsString();
     //TODO - Uncomment the print Statement below to print result.
     //System.out.println("The SaasService returned: "+result.getDataAsString());
     } catch (Exception ex) {
    ex.printStackTrace();
     } 
     return "";
    }
  2. 打开 googlemapserviceauthenticator.properties。将 api_key 属性设置为 步骤 3 中从 Google 获取的 API 密钥。

  3. 打开“服务”选项卡并启动应用服务器。

  4. 右键单击 CustomerDB 项目节点并选择“测试 REST Web 服务”。IDE 将取消并重新部署您的项目到服务器上,然后打开含测试客户机的浏览器窗口。

  5. 单击左侧边栏中的 customerscustomers 的测试标准将在主窗格中打开。保留默认选项不变,单击“测试”按钮。这将打开一个用户表。

  6. 从表中选择一个用户,如 customer1。单击该用户。该用户 的测试标准将在主窗格中打开。从下拉列表中,选择 text/html MIME 类型。单击“测试”按钮。该地址的 GoogleMap 将在原视图中打开。

    注意:如果 GoogleMaps 无法找到地址,它将显示放大的海洋视图。

    Google Map 显示了数据库中的用户地址

  7. 您可以将 URL 替换为 http://localhost:8081/CustomerDB/resources/customers/2/googleMap, .../3/googleMap(依此类推,一直到 25),查看所有用户的地图地址。


将反馈发送给我们



更多信息

有关使用 NetBeans IDE 6.0 开发 Java EE 应用程序的更多信息,请参见以下资源:

要发送意见和建议,获取支持,了解关于 NetBeans IDE Java EE 开发特性的最新发展,请加入 邮件列表

Companion
Projects:
MySQL Database Server   GlassFish Community: an Open Source Application Server   Open Solaris  Open JDK: an Open SourceJDK   Mobile & Embedded Community     Sponsored by 
Sponsored by Sun Microsystems