本文还有配套的精品资源,点击获取

简介:WebService是一种使用WSDL定义、XML数据传输和SOAP通信协议的平台独立交互方式。本教程向初学者介绍WebService的基本组件和创建使用步骤,包括接口定义、服务实现、部署、消费以及测试,旨在加深对WSDL、SOAP等核心技术的理解,并熟悉JAX-WS开发框架和相关工具。

1. WebService入门基础介绍

WebService是一种基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得WebService能与其他兼容的组件进行互操作。

1.1 WebService的定义与优势

WebService允许应用程序通过网络进行通信,以XML格式交换数据。它们提供了一种在不同平台上使用不同编程语言的应用程序之间实现互操作性的方法。与传统的分布式技术相比,WebService的优势在于它们不受限于特定的开发语言和平台,可以很容易地在企业内部或通过互联网进行部署和访问。

1.2 WebService的工作原理

在最基础的层面,WebService通过HTTP协议传输XML数据来实现服务的请求与响应。客户端向WebService发送一个带有XML请求的HTTP POST请求,WebService处理请求后,返回一个XML响应。这种基于请求-响应模型的方式非常适合网络通信,因为它允许数据通过防火墙,且易于被任何能够解析XML的系统所理解。

1.3 WebService的技术栈

WebService的技术栈主要由以下几个核心协议组成: - SOAP (Simple Object Access Protocol) :一个基于XML的消息传递协议,用于在网络中交换结构化信息。 - WSDL (Web Services Description Language) :一种基于XML的描述语言,用于描述网络服务的功能、位置和协议绑定。 - UDDI (Universal Description, Discovery and Integration) :一个目录服务,企业可以通过它注册和搜索WebService。

了解这些基础概念后,我们才能更好地深入学习WebService的技术细节,并在后续章节中探讨WSDL的编写、SOAP协议的原理,以及UDDI的实际应用。

2. WSDL的理论与应用

2.1 WSDL的概念与结构

2.1.1 WSDL的定义与作用

WSDL(Web Services Description Language)是一个用于描述网络服务的语言,它使用XML文档格式来定义一套服务的接口。WSDL不仅能够描述服务能做什么,而且能够说明如何调用这些服务。WSDL的作用在于提供了一种标准的方式来描述Web服务的功能,允许不同的软件系统在不同的平台上进行交互。

2.1.2 WSDL文档的组成要素

WSDL文档主要由以下几部分组成:

types : 定义交换的消息类型。 message : 描述操作的输入和输出。 portType : 定义一系列操作。 binding : 指定特定的协议和数据格式。 port : 绑定特定的网络地址到一个服务。 service : 集合一个或多个端口。

2.2 WSDL文档的编写与解析

2.2.1 手动编写WSDL文档的方法

手动编写WSDL文档是一种较为复杂且容易出错的过程,需要编写者有良好的XML知识基础。以下是一个简单的WSDL文档结构示例:

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:tns="http://example.com/service"

name="ExampleService"

targetNamespace="http://example.com/service">

xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://example.com/service">

2.2.2 使用工具自动生成WSDL文档

在实际开发中,通常会使用各种辅助工具自动生成WSDL文档。例如,使用Java中的JAX-WS框架,可以通过注解的方式自动生成WSDL。以下是一个简单的Java类例子,使用JAX-WS注解定义了一个Web服务:

import javax.jws.WebService;

import javax.jws.soap.SOAPBinding;

@WebService

@SOAPBinding(style = SOAPBinding.Style.RPC)

public class Calculator {

public int addNumbers(int x, int y) {

return x + y;

}

}

使用JAX-WS提供的 wsimport 工具,可以从上述Java类生成相应的WSDL文档。

2.3 WSDL在WebService中的应用实践

2.3.1 WSDL在服务描述中的应用

WSDL文档在服务描述中起到了核心作用。它使得服务的发布者能够提供标准化的接口定义,而服务的消费者则可以利用这些信息来了解如何调用服务以及它们应该期待什么结果。在服务描述中,WSDL包含了所有必要元素,如消息类型、操作和绑定等,为服务的发现、绑定和调用提供详细说明。

2.3.2 WSDL与服务绑定的具体实现

WSDL与服务绑定的具体实现涉及到如何将WSDL描述的操作映射到后端服务的具体实现上。这通常涉及以下几个步骤:

服务端实现 - 开发者根据WSDL定义实现后端逻辑。 部署服务 - 将实现的服务部署到服务器上,并确保服务可用。 服务绑定 - 将WSDL中定义的服务端点地址与实际部署的URL关联起来。 客户端调用 - 客户端通过WSDL描述的服务端点和操作接口调用远程服务。

WSDL使得这些步骤可以高效地完成,因为它提供了一种标准化的方法来定义和识别服务的接口和行为。

3. SOAP协议的原理与应用

SOAP(Simple Object Access Protocol)是一种基于XML的消息协议,用于在网络环境中交换结构化信息。SOAP最初设计为一种远程过程调用(RPC)机制,但随着时间的推移,它已经演变成为一个用于分布式环境中的消息传递框架。

3.1 SOAP协议的基本概念

3.1.1 SOAP的定义与特点

SOAP被定义为一种轻量级的、基于XML的消息传输协议。它的主要特点包括:

平台无关性 :SOAP使用基于XML的消息格式,可以跨平台使用。 协议独立性 :SOAP不依赖于任何特定的传输协议,但通常使用HTTP。 可扩展性 :SOAP允许在消息中包含任何类型的信息,增加了消息的可扩展性。 互操作性 :由于其基于标准XML和HTTP,SOAP提高了不同系统之间的互操作性。

3.1.2 SOAP消息的结构和工作原理

一个SOAP消息可以包含以下几个部分:

Envelope :消息的根元素,定义了消息的开始和结束。 Header :包含可选的SOAP消息头块,这些可以包含如事务控制、安全信息等元数据。 Body :包含必需的消息体,包含了调用的详细信息和响应数据。 Fault :可选,如果在消息处理过程中发生错误,此元素将描述错误信息。

工作原理上,SOAP消息通常由客户端发出,通过HTTP协议发送到服务器端,服务器处理完毕后再通过HTTP返回给客户端。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

DIS

在上述示例中,定义了一个SOAP消息的Envelope,包含一个请求调用GetLastTradePrice的操作,以及一个StockSymbol参数。

3.2 SOAP协议的应用场景

3.2.1 SOAP在分布式系统中的角色

SOAP在分布式系统中扮演了一个重要的角色,特别是在需要远程过程调用和跨平台通信的场合。使用SOAP,客户端可以轻松地调用远程服务端的方法,就像本地调用一样。SOAP消息可以穿越防火墙,并且能够在各种网络环境下工作,如企业内部网络和因特网。

3.2.2 SOAP与其他协议的对比分析

与REST等其他协议相比,SOAP提供了更加严格的消息格式和协议标准。然而,这也意味着SOAP消息通常比RESTful服务更加复杂和冗长。REST通常被看作是轻量级的解决方案,它使用标准的HTTP方法,如GET、POST、PUT和DELETE,来进行资源的CRUD操作,并直接使用HTTP的状态码来表示操作的结果。

SOAP的严格消息格式有助于确保消息的完整性,但在某些情况下会牺牲性能。相比而言,REST可能在性能上更具优势,特别是在处理简单的CRUD操作时。

3.3 SOAP的高级特性与实践

3.3.1 SOAP的安全机制

安全性是任何通信协议中不可忽视的一部分。SOAP定义了WS-Security标准,为SOAP消息提供了加密、数字签名和安全令牌传递的能力。WS-Security还可以与现有的安全解决方案(如Kerberos、X.509证书和SAML令牌)集成,增强了SOAP通信的安全性。

上例展示了一个SOAP消息中用于签名消息的WS-Security头部分。使用这种机制可以确保消息在传输过程中未被篡改,并验证发送者的身份。

3.3.2 基于SOAP的Web服务开发实践

在Web服务开发中,使用SOAP协议可以为复杂的业务逻辑和跨平台的系统交互提供稳定和可扩展的解决方案。在Java中,开发人员通常使用JAX-WS(Java API for XML Web Services)来创建SOAP Web服务。

import javax.jws.WebService;

@WebService

public interface GreetingService {

String sayHello(String name);

}

import javax.jws.WebService;

@WebService(endpointInterface = "com.example.GreetingService")

public class GreetingServiceImpl implements GreetingService {

public String sayHello(String name) {

return "Hello, " + name;

}

}

在上述Java代码中,定义了一个简单的GreetingService Web服务。服务实现 GreetingServiceImpl 提供了 sayHello 方法的实现,客户端可以通过这个服务接口与服务端进行通信。

通过本章节的介绍,我们了解了SOAP协议的基本概念、应用场景以及如何在实际开发中应用SOAP协议。这些知识对于理解SOAP如何在Web服务中发挥作用至关重要。接下来,我们将深入探讨UDDI(Universal Description, Discovery, and Integration)的功能和实际应用。

4. UDDI的功能与实际应用

4.1 UDDI的核心功能解析

4.1.1 UDDI的定义与组成

统一描述、发现和集成(UDDI)是一个工业标准,用于发布和发现Web服务。它定义了一种方式,使企业能够通过互联网注册和搜索服务,以及发现与其他企业的交互方式。UDDI的核心功能包括注册服务、发现服务和绑定服务。服务的注册过程包括创建一个包含企业信息、服务描述和访问点的目录条目。然后,其他希望使用这些服务的企业可以通过UDDI注册中心查询这些信息。

UDDI注册中心提供了一个标准化的方法,允许企业跨多种技术和服务实现之间共享关键的业务和服务信息。这些信息通常被组织在三种类型的结构化信息中:白页(企业信息)、黄页(分类信息)、绿页(技术详细信息)。UDDI标准提供了三种主要的数据结构:

tModel:一种抽象定义,用于识别技术规范或一组API。 businessEntity:代表一个企业的信息,包括白页数据。 bindingTemplate:定义如何通过网络与服务交互,包括技术接口和安全要求。

4.1.2 UDDI的注册与发现机制

UDDI的注册机制允许企业发布其Web服务的元数据,使得其他企业或开发者能够发现和利用这些服务。注册过程主要是将企业的服务信息填充到UDDI数据结构中,并将其提交到UDDI注册中心供外界检索。

发现机制是通过查询UDDI注册中心来获取所需服务信息的过程。这通常涉及到使用标准的查询语言,如XPath或UDDI API,搜索特定的业务实体或服务描述。当查询被发起时,UDDI注册中心会返回与查询条件匹配的服务条目信息。通过这种方式,UDDI不仅促进了服务的发现,还允许企业动态地发现新的合作伙伴和新的服务。

下表展示了UDDI中不同数据结构的用途和组成部分:

| 数据结构 | 用途 | 组成部分 | | --- | --- | --- | | tModel | 定义技术规范 | 编号、名称、描述、分类 | | businessEntity | 企业信息 | 编号、名称、发现URL、联系信息、分类 | | bindingTemplate | 服务交互细节 | 编号、名称、描述、访问点、技术规范引用 |

4.2 UDDI在WebService中的应用案例

4.2.1 企业级应用中的UDDI使用场景

在企业级应用中,UDDI可以用于内部服务的发现和集成。例如,一个大型企业可能拥有多个部门,每个部门都有自己的Web服务。通过使用UDDI注册中心,各个部门可以共享服务元数据,使得整个组织可以更加高效地利用现有的服务资产,而无需重复开发。

此外,UDDI也可用于企业与其合作伙伴之间的交互。当合作伙伴需要接入企业的系统或服务时,可以通过UDDI快速找到需要的信息,从而缩短集成时间,降低沟通成本。例如,一个电子零售商可以通过UDDI查找供应商提供的库存管理和订单处理服务,并动态地将这些服务集成到其电子商务平台中。

4.2.2 UDDI在服务集成中的作用

在服务集成过程中,UDDI的作用是作为服务的目录和查询服务。当企业需要集成一个新的Web服务时,他们可以查询UDDI注册中心来查找候选服务。一旦找到合适的服务,企业就可以直接与其通信,而无需其他复杂的过程。

UDDI不仅支持静态服务发现,还可以支持动态服务发现。这意味着当服务变更时,企业可以通过UDDI及时获取更新的信息。这样的动态更新机制保证了服务集成的灵活性和可扩展性,使得服务集成更加平滑和高效。

4.3 UDDI的扩展与未来发展趋势

4.3.1 UDDI标准的演进

自UDDI规范发布以来,它已经经历了多个版本的演进。最初的UDDI版本主要集中在Web服务的注册和发现上,但随着业务需求和技术的发展,UDDI标准也在持续进化,以解决更复杂的服务集成问题。

例如,UDDI v3规范引入了更强的语义支持和扩展性,包括支持WS-Addressing和WS-Security等WS-*标准。v3版本也支持REST风格的Web服务描述,这意味着UDDI能够更好地与现代Web技术集成。此外,v3版本还包括对SOA治理的强化,帮助企业更好地控制服务的生命周期。

4.3.2 UDDI在云服务中的应用展望

随着云计算的兴起,UDDI有潜力在云服务市场中扮演关键角色。云服务提供商可以使用UDDI作为其服务目录,允许企业发现和订阅可用的云服务,如计算资源、数据存储、API接口等。通过UDDI,企业能够更轻松地进行云服务的选择和管理。

此外,UDDI的动态发现和集成能力对于构建弹性和可扩展的云应用至关重要。开发者可以在需要时快速发现云中可用的服务,并将它们集成到应用程序中,从而实现快速的原型开发和部署。

未来,随着容器化技术、微服务架构以及服务网格的流行,UDDI可能会继续演进,以支持更细粒度的服务发现和治理,进一步推动企业和服务提供商之间的互操作性。

5. WebService开发与部署流程

随着信息技术的快速发展,WebService作为一种跨平台、语言无关的应用服务框架,在企业级应用集成中扮演了越来越重要的角色。本章将详细介绍WebService的开发和部署流程,包括接口的定义、服务的实现与部署以及服务的消费与测试方法。

5.1 接口定义的关键步骤

在开发WebService之前,首先需要明确定义服务接口。接口的定义是服务提供者和消费者之间进行沟通的桥梁,是后续开发和实现的基础。

5.1.1 设计Web服务的业务逻辑

设计业务逻辑是开发WebService的第一步,它涉及到需求分析、功能规划以及业务流程的梳理。在设计过程中,我们需要明确服务需要提供的功能、操作以及业务处理流程。这一阶段常常会使用到用例图、活动图等UML(统一建模语言)工具来辅助完成设计。

例如,考虑一个在线书店提供的订单管理WebService,业务逻辑可能包括创建订单、查询订单状态、修改订单以及取消订单等功能。这些功能的定义将直接影响到接口的定义和后续的实现。

5.1.2 使用WSDL描述接口

在设计好业务逻辑之后,下一步是使用WSDL(Web Services Description Language)描述接口。WSDL是一个基于XML的接口描述语言,它用来描述网络服务的具体细节,包括它所提供的操作、消息格式以及绑定信息等。

在编写WSDL文档时,需要定义 元素来描述抽象接口, 元素来定义操作参数和返回类型, 元素来指定网络服务的访问点,以及 元素来定义服务的集合。以下是一个简单WSDL文档的代码片段:

targetNamespace="http://example.com/order"

xmlns="http://schemas.xmlsoap.org/wsdl/"

xmlns:tns="http://example.com/order"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

在这个示例中,我们定义了一个名为 OrderManagementService 的WebService,它有一个 OrderManagement 的接口类型,包含一个 createOrder 的操作。这个操作的输入消息为 CreateOrderRequest ,输出消息为 CreateOrderResponse 。接着定义了一个 OrderManagementSOAP 的SOAP绑定,指定了消息的编码和HTTP传输方式。最后定义了服务的访问点 OrderManagementPort ,并指向了一个URL地址。

5.2 服务实现与部署策略

接口定义完毕之后,接下来是服务的实现和部署。这部分工作包括编写服务端的代码,以及如何将服务打包、部署到服务器上,并对外提供服务。

5.2.1 编写服务端代码实现业务逻辑

根据设计好的接口和WSDL描述,开发者需要使用具体的编程语言(如Java、C#等)来实现业务逻辑。这个阶段的关键是确保实现的代码能够准确地遵循WSDL文档定义的消息格式和操作逻辑。

例如,假设使用Java语言来实现上述的订单管理WebService,代码可能类似于以下结构:

@WebService(serviceName = "OrderManagementService")

public class OrderManagementImpl implements OrderManagement {

public CreateOrderResponse createOrder(CreateOrderRequest request) {

// 实现创建订单的逻辑

// ...

return new CreateOrderResponse();

}

}

在这个Java WebService示例中, OrderManagementImpl 类实现了 OrderManagement 接口, createOrder 方法负责创建订单的业务逻辑。开发者需要在这个方法中编写具体的业务处理代码。

5.2.2 服务的打包、部署和发布

编写完服务端代码之后,需要将服务进行打包、部署和发布。通常,这涉及到将Java代码编译打包成WAR或EAR文件,并部署到支持Servlet容器(如Tomcat、JBoss等)的Web服务器上。

在发布过程中,开发者需要配置服务器环境,设置服务的URL访问路径,并确保所有的网络配置正确无误,以便客户端能够通过网络访问到这些服务。

在发布服务之后,通常还需要配置一些安全设置,例如使用HTTPS来加密客户端与服务端之间的通信,以及配置访问控制列表(ACL)来限制服务的访问权限。

5.3 WebService的消费与测试方法

当WebService开发完成并且部署在服务器上之后,接下来就需要客户端来消费这些服务了。同时,为了保证服务的质量,需要进行一系列的测试。

5.3.1 客户端代码的编写与配置

客户端需要根据服务端的WSDL文档来生成相应的服务消费代码。这通常可以通过使用诸如wsimport这类的命令行工具来完成,该工具会根据WSDL文档自动产生客户端代理代码。

客户端代码的编写涉及到配置服务引用,包括WSDL的URL地址、服务端点地址等。然后,客户端代码通过生成的代理类来调用服务端的方法,实现业务逻辑。

5.3.2 使用工具进行服务测试

在实际使用WebService之前,进行服务测试是非常重要的一步。测试的目的是验证服务的功能、性能以及稳定性是否符合预期。常见的测试工具有SoapUI、Postman等,它们能够发送SOAP请求,并检验服务的响应。

在测试过程中,可以从简单的功能测试开始,验证每个操作的正确性。然后逐步进行压力测试和负载测试,模拟高并发情况下服务的行为,确保服务的健壮性。

此外,测试过程中产生的日志和错误信息将有助于开发者进行问题的诊断和调试。通过测试,开发者能够确保每个服务端点按预期工作,并且客户端能够正确处理响应数据。

总结而言,WebService的开发与部署流程是一系列复杂但有序的工作,从接口的定义、服务的实现到服务的消费与测试,每一步都需要精心设计和执行。通过遵循本章的指导,开发者将能更有效地掌握WebService的开发实践,构建稳定可靠的企业级Web服务。

6. 利用JAX-WS和客户端工具优化开发

6.1 JAX-WS框架的介绍与优势

6.1.1 JAX-WS的基本概念和框架架构

JAX-WS(Java API for XML Web Services)是Java平台中用于创建Web服务的一种API。其主要作用是简化Java环境下的SOAP服务和SOAP客户端的开发。JAX-WS是J2EE的一部分,支持基于XML的消息交换模式,是构建面向服务的架构(SOA)的基础组件。

JAX-WS框架允许开发者通过简单的注解,将普通的Java类或方法暴露为Web服务。JAX-WS支持Java到WSDL的映射,并且可以处理消息的绑定与传输。其支持最新的Java EE平台,提供了一种高效、类型安全的方式来处理XML数据。

JAX-WS还支持异步调用,这对于性能要求较高的场景非常有用。异步模式允许客户端在发起Web服务调用后,不等待服务完成即可继续执行其它任务,提高了程序的并发处理能力。

6.1.2 JAX-WS与其他框架的比较

与早期的JAX-RPC相比,JAX-WS更加轻量级,并且对Web服务规范的支持更加全面。JAX-WS对Java SE和Java EE环境都提供了支持,而JAX-RPC则更偏向于Java EE。

在与其他流行框架的比较中,例如Apache CXF、Spring Web Services等,JAX-WS依然保持其简便性和标准性的优势。Apache CXF提供了更多的配置选项和扩展性,而Spring Web Services则更强调面向契约的开发(契约优先),这些框架都为开发者提供了不同方面的选择。

6.2 JAX-WS在实际开发中的应用

6.2.1 利用JAX-WS创建和配置Web服务

创建一个基本的Web服务通常涉及以下步骤:

定义服务接口,并使用 @WebService 注解标记。 实现服务接口,并使用 @WebMethod 注解标记服务方法。 使用JAX-WS提供的工具(如 wsimport )自动生成WSDL文档和服务端代码。 部署Web服务到服务器。

下面是一个简单的Web服务实现示例:

import javax.jws.WebService;

import javax.jws.WebMethod;

@WebService

public interface GreetingService {

@WebMethod

String sayHello(String name);

}

@WebService(endpointInterface = "GreetingService")

public class GreetingServiceImpl implements GreetingService {

@WebMethod

public String sayHello(String name) {

return "Hello, " + name;

}

}

6.2.2 管理服务的生命周期和异常处理

在Web服务的生命周期管理中,JAX-WS提供了一系列的方法来控制服务的启动和关闭。此外,JAX-WS支持异常处理,通过 @WebFault 注解可以将业务异常转换为SOAP faults,从而允许客户端以标准方式处理这些异常。

@WebService

public class FaultService {

@WebMethod

public String throwFault() throws FaultException {

throw new FaultException("Error occurred.");

}

}

public class FaultException extends Exception {

public FaultException(String message) {

super(message);

}

}

6.3 客户端代理类的生成与使用

6.3.1 使用JAX-WS生成客户端代理类

客户端代理类为客户端调用Web服务提供了一个简单的方式。可以通过 wsimport 工具根据WSDL自动生成客户端代理类。客户端只需要创建这个代理类的实例,并调用相应的方法即可。

以下是使用 wsimport 命令生成客户端代理类的过程:

wsimport -keep -verbose http://localhost:8080/GreetingService?wsdl

生成的客户端代理类代码可以像下面这样使用:

public class Client {

public static void main(String[] args) {

GreetingService service = new GreetingServiceImpl();

String result = service.sayHello("World");

System.out.println(result);

}

}

6.3.2 客户端代理类的高级应用技巧

在实际开发中,开发者可以利用JAX-WS提供的高级特性来优化客户端的使用。例如,可以使用 Handler 链来自定义SOAP消息的处理逻辑,或者使用拦截器模式来执行通用的服务请求前后的操作。

此外,可以结合Spring框架来管理服务的依赖注入,使用声明式的事务管理来控制服务调用。

6.4 基于工具的WebService测试与分析

6.4.1 使用SOAP UI等工具进行测试

SOAP UI是一个流行的Web服务测试工具,可以用来模拟客户端向Web服务发送SOAP消息,并验证响应。测试时,可以将WSDL文档导入SOAP UI,然后创建测试用例,配置请求参数,并观察响应结果。

使用SOAP UI可以确保Web服务按预期工作,验证功能性和性能。此外,SOAP UI支持数据驱动测试和负载测试,能够帮助开发者进行更全面的质量保证。

6.4.2 分析和解读测试结果与源码

测试完成后,要仔细分析结果,查看是否有错误发生。如果服务返回了SOAP faults,需要对故障进行分析并进行相应的调试。此外,对响应消息的分析是验证数据是否正确处理的关键部分。开发者需要检查返回的XML消息结构是否与WSDL定义相符合,数据值是否符合预期。

此外,可以通过查看SOAP UI中生成的测试报告来获取性能指标,如响应时间、吞吐量等,这些数据对于评估Web服务的性能至关重要。

使用JAX-WS和客户端工具进行WebService开发和测试,可以有效地简化开发流程,提高开发效率,并确保服务的高质量。这些技术的结合不仅使Web服务开发更加高效,同时也为服务的维护和优化提供了便利。

本文还有配套的精品资源,点击获取

简介:WebService是一种使用WSDL定义、XML数据传输和SOAP通信协议的平台独立交互方式。本教程向初学者介绍WebService的基本组件和创建使用步骤,包括接口定义、服务实现、部署、消费以及测试,旨在加深对WSDL、SOAP等核心技术的理解,并熟悉JAX-WS开发框架和相关工具。

本文还有配套的精品资源,点击获取