面试必备整理:Web API面试题和答案合集

2021年12月12日19:46:29 发表评论 1,016 次浏览

Web API 介绍:

  • 2000 年 2 月 7 日:Web API 于 2 月 7 日与 Salesforce 一起首次在野外引入。Salesforce 公司在 IDG Demo 2000 会议上正式推出其 API。
  • 2000 年 11 月 20 日:eBay 于 2000 年 11 月 20 日通过 eBay 开发人员计划推出了他们的 eBay API。
  • 2002 年 7 月 16 日:亚马逊于 2002 年 7 月 16 日推出了 Amzon.com 网络服务,允许开发人员将 amazon.com 的内容和功能实施到他们自己的网站中。

Web API 最早出现在互联网的早期电子商务中。目前,Web API 仍被主流企业视为一种爱好。 

基本Web API面试题和答案合集

1. 为什么 Web API 很重要?

Web API 通常被认为是一种服务,它基本上从服务器向我们提供信息或数据。由于以下原因,这非常重要:

  • 它用于为网站和客户端应用程序提供访问数据的接口。
  • 它还可用于从数据库访问数据并将数据保存回数据库。
  • 它支持不同的文本格式,如 XML、JSON 等。
  • 它适用于或兼容任何类型的浏览器和任何类型的设备,如移动、桌面、网络等。
  • 它使用低带宽,例如 XML 或 JSON 数据等,因此被认为适用于带宽有限的设备,例如智能手机等。
  • 从商业角度来看,Web API 更适用于 UI/UX,增加对公司产品和服务的兴趣,增加网站流量。

2. Web API常见面试题有哪些:什么是 Web API,我们为什么要使用它?

Web API面试题解析:Web API(应用程序编程接口),顾名思义,是一种可以使用 HTTP 协议通过 Web 访问的 API。它基本上被认为是向各种不同服务揭示或揭示数据和服务的最佳平台。它是一个工具,可以用来将数据推送到服务器,并且可以被服务器代码访问。它可以使用各种技术(如 java、ASP.NET 等)构建或开发。 


Web API 用途:

  • 它包含简单的标准化通信的附加层,并提供有关如何格式化输入和输出的不同选项。
  • 它可以与 ASP.NET MVC 和不同类型的 Web 应用程序(如 ASP.NET WebForms)一起使用。
  • 如果要创建面​​向资源的服务,那么 Web API 服务被认为是最好的。
  • 它还有助于开发 REST-ful 服务和基于 SOAP 的服务。

3. Web API 支持的主要返回类型有哪些?

它没有任何特定的数据类型。它可以根据业务需求返回任何类型的数据。HTTP 方法有很多,如 GET、POST、PUT 等,它们可以根据用例返回不同格式的数据。

4. Web API 和 WCF 有什么区别?

WCF(Windows Communication Foundation):它是用于开发 SOAP(面向服务的应用程序)的框架。该框架用于开发、配置和部署或实现网络分布式服务。 

Web API:它是 Web 浏览器和 Web 服务器的应用程序编程接口。浏览器 API 只是扩展或增加了 Web 浏览器的功能,而服务器 API 只是扩展或增加了 Web 服务器的功能。

Web APIWCF
它用于开发基于 SOAP 的服务和 RESTful 服务。它仅用于部署基于 SOAP 的服务。
它支持各种MVC特性,如路由、模型绑定等。它不支持任何 MVC 功能。
它只支持 HTTP 协议。它支持各种协议,如 HTTP、UDP、自定义传输。
它被认为最适合开发 RESTFUL 服务。它仅支持有限的 RESTFUL 服务。
当一个人想要公开一系列昂贵的客户端(如 iPhone、浏览器、手机、平板电脑等)时,这是很好的。它适用于创建使用快速传输通道(如 TCP、UDP、命名管道等)的服务。
它提供对 UTF-8 编码格式的支持。它提供文本、二进制编码支持、MTOM(消息传输优化机制)等。

5. 为什么选择 Web API 而不是 WCF?

由于以下原因,Web API 被认为是优于 WCF 的最佳选择:

  • Web API 使用 HTTP 的所有功能,例如 URI、请求/响应标头、缓存、版本控制、各种内容格式等。
  • 不必为 Web API 中的不同设备定义或解释任何额外的配置设置。
  • Web API 使用不同的文本格式,包括 XML,因为它更快,更适合轻量级服务。
  • Web API 还支持 MVC 功能,而 WCF 不支持 MVC 功能。
  • 与 WCF 相比,Web API 提供了更多的灵活性。
  • Web API 使用令牌身份验证、基本身份验证等标准安全性来提供安全服务,而 WCF 使用 WS-I 标准来提供安全服务。 

6. REST API 和 RESTful API 有什么区别?

REST(表示状态传输)API:它基本上是一种架构风格,可以有效地利用现有的网络技术和协议。这是开发人员在开发可扩展的 API 或服务时需要遵循的一组规则。它与使用其动词(如 GET、DELETE、POST、PUT)的 HTTP 协议一起使用。 
RESTful API:简称为 Web 服务执行,例如架构。  

REST APIRESTful API
REST 是一种用于创建 Web 服务的架构模式。RESTful API 用于实现该模式。
REST 的数据格式基于 HTTP。RESTful 的数据格式基于JSON、HTTP 和Text。
URL 的工作基于请求和响应。RESTful 的工作基于 REST 应用程序。
更加人性化,对所有企业和IT的适应性强。它太灵活了。
需要开发允许客户端和服务器之间交互的 API。它只是遵循 REST 基础设施,提供整个网络上不同系统之间的互操作性。

7、在Web API中使用Rest有什么好处?

由于以下原因,REST 在 Web API 中非常重要和有益:

  • 它允许客户端和服务器之间较少的数据传输。
  • 它易于使用且重量轻。
  • 它提供了更多的灵活性。
  • 它还处理和控制各种类型的调用,返回各种数据格式。
  • 它被认为最适合在移动应用程序中使用它,因为它可以减少客户端和服务器之间的数据传输。
  • 它使用简单的 HTTP 调用进行机器间通信,而不是使用更复杂的选项,如 CORBA、COM+、SOAP 或 RPC。 

8. Web API面试题和答案合集:什么是 REST 和 SOAP?它们之间有什么不同?

REST (Representational State Transfer):它是一种新的改进形式的 Web 服务。它描述了网络系统的架构风格。当请求发送到服务器时,它不需要更大的带宽。它只包含 JSON 消息。例如:

{"city":"Mumbai","state":"Maharashtra"}

SOAP(简单对象访问协议):它是一种简单且轻量级的协议,通常用于在 Web 上交换结构化和类型化信息。它主要适用于 HTTP 和 RPC(远程过程调用)。该协议主要用于 B2B 应用程序,可以与其定义数据契约。SOAP 消息的内容更重,因此使用更大的带宽。

例如:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope" SOAP-ENV:encodingStyle=" http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
<Demo.guru99WebService xmlns="http://tempuri.org/">   <EmployeeID>int</EmployeeID>   
</Demo.guru99WebService> 
</soap:Body>
</SOAP-ENV:Envelope>
RESTSOAP
它基本上是一种架构模式。它基本上是一个消息传递协议。
它通常适用于各种文本格式,例如纯文本、HTML、JSON、XML 等。它仅适用于 XML 格式。
它是完全无状态的。它有一些关于无状态和有状态实现的规范。
与 SOAP 相比,它的性能更快。与 REST 相比,其性能较慢。
它使用 XML 和 JSON 来发送和接收数据。它使用 WSDL(Web 服务描述语言)在消费者或用户和提供者之间进行通信。
REST 必须在确定任何错误时重新发送传输。SOAP 包括对使用 WS-ReliableMessaging 规范的通信错误的内置错误处理。
它使用 URL 路径调用服务。它通过调用 RPC(远程过程调用)方法来调用服务。

9. 什么是 Web API 2.0?

它基本上是 Web API 的增强和修改功能。这个新版本支持各种新功能,如下所示:

  • 新路由属性
  • 使用 OAuth 2.0 保护 ASP.NET Web API
  • 使用 CORS 支持跨域请求
  • IHttpActionResult 返回类型
  • 支持在 OData 服务中$展开、$选择

由于 Web API 2.0 的所有新特性,它被认为是最佳选择和合适的开发模型,可以更轻松地为运行在各种平台上的不同客户端开发 RESTful 服务接口。它还支持在 Web API 方法或控制器级别配置路由。

10. 解释媒体类型格式化程序。

Web API面试题解析:在 Web API 中,媒体类型格式化程序是负责序列化数据的类。这里的序列化一般是指将数据转换成以后可以传输和重构的格式的过程。由于序列化请求/响应数据,Web API 可以更好地理解请求数据格式,并以客户端期望的格式发送数据。它只是指定在 HTTP 响应或请求中在客户端和服务器之间传输的数据。 

媒体类型格式化程序类MIME 类型描述
JsonMediaTypeFormatter应用程序/json,文本/json处理 JSON 格式
XmlMediaTypeFormatter应用程序/xml,文本/json处理 XML 格式
FormUrlEncodedMediaTypeFormatter应用程序/x-www-form-urlencoded处理 HTM 表单 URL 编码数据
JQueryMvcFormUrlEncodedFormatter应用程序/x-www-form-urlencoded处理模型绑定的 HTML 表单 URL 编码数据

11. Web API 支持哪些协议?

Web API 一般只支持 HTTP 协议。 

12. WEB API 使用以下哪些开源库进行JSON 序列化?

Web API 通常使用 Json.NET 库进行 JSON 序列化。 

13. 什么是 XML 和 JSON?

XML(可扩展标记语言): 

  • 它专为存储和传输数据而设计。
  • 它类似于 HTML,但比 HTML 更灵活,因为它允许用户创建自己的自定义标签。
  • 它用于表示结构化信息,如文档、数据、配置等。


JSON(JavaScript 对象表示法): 

  • 它是一种轻量级格式,旨在存储和传输数据。
  • 它更容易理解,是一种标准的基于文本的格式,用于表示基于 JavaScript 对象语法的结构化数据。
  • 它更快,更易于使用。 

14. 什么是 Web API 过滤器?

过滤器基本上用于在 Web API 框架请求处理的不同级别添加额外的逻辑。不同类型的 Web API 过滤器可用,如下所示:

  • 身份验证过滤器:它处理身份验证并验证 HTTP 请求。它还有助于验证用户详细信息。它检查用户的身份。
  • 授权过滤器:它处理授权。它在控制器动作之前运行。此过滤器用于检查用户是否通过身份验证。如果用户未通过身份验证,则它会返回 HTTP 状态代码 401 而不调用该操作。
  • AuthorizeAttribute是 Web API 提供的内置授权过滤器。
  • Action Filter : 它是一种可以应用于控制器动作或整个控制器的属性。它用于在控制器动作执行之前或之后添加额外的逻辑。它只是一种向 Web API 服务添加额外功能的方法。
  • 异常过滤器:用于处理 Web API 中未处理的异常。每当控制器操作抛出非 HttpResponseException 的未处理异常时,就会使用它。它将实现一个“IExceptionFilter”接口。
  • 覆盖过滤器:用于从全局过滤器或控制器级别过滤器中排除特定的操作方法或控制器。它仅用于修改单个操作方法的其他过滤器的行为。 

15.谁可以使用Web API?

浏览器、移动设备、iPhone 等大量客户端都包含或使用 Web API。它也适用于需要 Web 服务但不需要 SOAP 支持的本机应用程序。它也可以被任何支持 HTTP 动词(如 GET、DELETE、POST、PUT)的客户端使用。

16.Web API常见面试题有哪些:如何处理Web API中的错误?

Web API 通常在处理错误方面提供更大的灵活性。异常处理是一种用于处理应用程序代码中的运行时错误的技术。可以使用HttpResponseException、HttpError、异常过滤器、注册异常过滤器、异常处理程序来处理错误。异常过滤器可用于识别动作或控制器上未处理的异常,异常处理程序可用于识别应用程序范围内的任何类型的未处理异常,当可能出现异常时,可以使用 HttpResponseException。 

17.如何全局注册异常过滤器?

可以使用以下代码全局注册异常过滤器:
GlobalConfiguration.Configuration.Filters.Add (new MyTestCustomerStore.NotImplExceptionFilterAttribute());
 

18.什么是MVC?编写MVC和Web API之间的区别?

MVC(模型、视图和控制器)基本上是一个应用程序设计模型,它包括三个互连部分,即模型、视图和控制器。它允许编码人员分解出应用程序的不同组件并更轻松地更新它们。它主要用于开发模型用户界面。它的主要目的是在结构中显示模式,将显示和数据分开,使它们都能在不影响其他人的情况下改变。 

MVCWeb API
它可用于构建以数据和视图形式回复的 Web 应用程序。它用于构建仅作为数据回复的 HTTP 服务。
它使用 JSONResult 以 JSON 格式返回数据。它以不同的格式返回数据,例如 JSON、XML 等。
支持内容协商、自托管。不支持内容协商、自托管。
它无法构建 REST-full 服务。它对于创建 REST-full 服务非常有帮助。
它返回一个视图 (HTML)。它返回 REST 响应。

ASP.NET Web API面试题和答案合集

19. 什么是 ASP.NET Web API?

ASP 代表活动服务器页面。ASP.NET 是旧 ASP 的更新版本。它是一个框架,用于开发 HTTP 服务以提供对客户端请求的响应。它可以在不同平台上的不同应用程序中访问。它由 Microsoft 开源技术提供,用于在 .NET Framework 之上开发和使用基于 HTTP 的服务。使用 ASP.NET Web API 构建 HTTP 服务非常容易。这些服务可以由不同的客户端使用,如下所示:

  • 桌面应用程序
  • 移动应用
  • 物联网
  • 浏览器

20.使用ASP.NET Web API有什么好处?

下面给出了使用 ASP.NET Web API 的一些核心优势:

  • 它为在 .NET Framework 上开发 RESTful 应用程序提供了最佳平台。
  • 它的工作方式与 HTTP 在 HTTP 动词(如 GET、POST、PUT、DELETE)的帮助下对所有 crud 操作的工作方式相同。
  • 它为 Web API 创建提供了足够的灵活性。
  • 它完全支持路由。
  • 它还支持模型绑定、验证、允许创建和使用 RESTful API 的 Odata(开放数据协议)。
  • 它具有在 ApiExplorer 的帮助下开发自定义帮助和测试页面的能力。
  • 可以开发非基于 SOAP 的服务,例如纯 XML、JSON 字符串等。
  • 它还增加了 RESTful 服务开发中的 TDD(测试数据驱动)方法。 

21. ASP.NET Web API 2.0 中使用了哪些新功能

ASP.NET Web API 包括许多令人兴奋的新功能,如下所示:

  • 属性路由
  • CORS(跨源资源共享)
  • OWIN(.NET 的开放 Web 界面)自托管
  • IHttpActionResult
  • Web API OData

22.HttpResponseMessage有什么用?

Web API面试题解析:它用于设置响应值,例如标头和状态控制。它只是允许我们使用 HTTP 协议。它表示封装数据和状态代码的 HTTP 响应消息。 

// GetEmployee action 
public HttpResponseMessage GetEmployee(int id) 
{     
     Employee emp = EmployeeContext.Employees.Where(e => e.Id == id).FirstOrDefault(); 
     if (emp != null) 
      { 
               return Request.CreateResponse<Employee>(HttpStatusCode.OK, emp);     
      }     else     
      { 
               return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Employee Not Found"); 
      } 
}

23. ApiController 和 Controller 有什么区别?

ApiController:用于返回串行排列后发送给客户端的数据。

public class TweetsController : ApiController
{
         // GET: /Api/Tweets/  
        public List<Tweet> Get()
      {
          return Twitter.GetTweets();
       }
} 

控制器:用于提供普通视图。  

public class TweetsController : Controller 
{  
        // GET: /Tweets/  [HttpGet]  public ActionResult Index() 
       {    
           return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);  
       }
}

24. 缓存是什么意思,它的类型是什么?

缓存基本上是一种将数据存储在某处或缓存中以供将来请求使用的技术或过程。缓存是一个临时存储区域。缓存将所有经常或最近访问的文件或数据保存在缓存内存中,并从缓存本身而不是数据或文件的实际地址访问它们。缓存接口只是改进了被缓存的请求/响应对象对的存储机制。

缓存的优点:

  • 它被认为是确保数据在需要提供服务的地方也以高效率提供服务的最佳解决方案,这对客户端和服务器都是最好的。
  • 它可以更快地将 Web 对象交付给最终用户。
  • 它减少了网站服务器上的加载时间。
  • 它可以更快地执行任何流程。
  • 它降低了网络成本。

缓存类型:
基本上有以下三种缓存类型:

  • 页面缓存
  • 数据缓存
  • 片段缓存

25. WCF 被 ASP.NET Web API 取代。真假?

WCF:它是用于开发 SOAP(面向服务的应用程序协议)的框架。它还支持上面给出的各种传输协议。 
ASP.NET Web API:它是一个用于开发非基于 SOAP 的服务的框架。它仅限于基于 HTTP 的服务。

不,ASP.NET Web API 取代了 WCF 是不正确的。WCF 通常被开发用于开发基于 SOAP 的服务。ASP.NET Web API 是一种开发非基于 SOAP 的服务(例如 XML、JSON 等)的新方法。如果他们的服务使用 HTTP 作为传输,并且他们想要转移到其他一些服务,则 WCF 仍然被认为是更好的选择像 TCP、NetTCP、MSMQ 等传输。WCF 还允许单向通信或双工通信。 

26. ASP 支持的主要返回类型有哪些。网络网络API?

它支持以下返回类型:

  • 响应消息
  • IHttpActionResult
  • Void
  • 其他类型,如字符串、整数等。 

27. Web API常见面试题有哪些:什么是 ASP.NET Web API 路由?

路由是 ASP.NET Web API 中最重要的部分。路由是 Web API 将 URI 与操作匹配的一种方式。它基本上是一个决定应该调用哪个动作和控制器的过程。控制器基本上是一个处理所有 HTTP 请求的类。控制器的所有公共方法基本上都称为动作方法或只是动作。每当 Web API 框架收到任何类型的请求时,它都会将该请求路由到操作。 

基本上有两种在 Web API 中实现路由的方法,如下所示:
基于约定的路由:Web API 支持基于约定的路由。在这种类型的路由中,Web API 使用路由模板来选择要执行的控制器和操作方法。 

基于属性的路由:Web API 2 通常支持一种称为属性路由的新型路由。顾名思义,它使用属性来定义路由。它是通过属性将路由添加到路由表的能力。 

28. 如何保护 ASP.NET Web API?

Web API 已成为对基于 Web 的交互进行编程的关键。任何知道 URL 的人都可以访问它。因此,它们已成为黑客的目标。人们需要通过控制 Web API 和决定谁可以和谁不能访问 Web API 来保护 Web API。基本上有两种方法或技术可以使我们的 Web API 更加安全。 

身份验证:这是一个帮助通过用户凭据(例如密码、用户名等)来识别和检查用户的过程。要访问 Web API,首先需要在请求标头中传递用户凭据。如果用户凭据未传递到请求标头中,则服务器返回 401 状态代码(未授权)。要使用的最佳身份验证是 OAuth 2.0。 

授权:这是一个有助于确定用户是否有权执行操作的过程。授权过滤器用于实现授权。

29. ASP.NET Web API 中的异常过滤器是什么?

异常过滤器通常用于处理 Web API 中生成的所有未处理的异常。它实现了 IExceptionFilters 接口。它是最容易和最灵活的实施方式。只要控制器方法在任何阶段抛出任何未处理的异常(不是 HttpResponseExecption 异常),就会执行此过滤器。 

30. 哪个.NET框架支持ASP.NET Web API?

.NET Framework 4.0 通常支持 ASP.NET Web API 的第一个版本。之后,.NET Framework 4.5 支持最新版本的 Web API,即 ASP.NET Web API 2。

31. 什么是Web API中的HttpConfiguration?

它被认为是包含不同属性的主类,借助这些属性可以覆盖 Web API 的默认行为。 

下面给出了一些属性:

  • DependencyResolver:它设置或获取依赖注入的依赖解析器。
  • 服务:它获取 Web API 服务。
  • ParameterBindingRules:它获取有关如何绑定参数的规则集合。
  • MessageHandlers:  它设置或获取消息处理程序。
  • 格式化程序:它设置或获取媒体类型格式化程序。

32. 我们可以从 ASP.NET Web API 方法返回 View 吗?

不,我们不能从 ASP.NET Web API 方法返回视图。ASP.NET Web API 开发提供原始数据或信息的 HTTP 服务。ASP.NET MVC 应用程序中的 ApiController 仅呈现序列化并发送到客户端的数据。可以使用控制器来提供普通视图。 

33. 什么是 ASP.Net Web API 中的内容协商?

内容协商基本上是从可用于给定响应的多个表示中选择最佳表示的过程。它只是允许人们选择而不是协商人们想要作为回应的内容。它在服务器端执行。简而言之,它为事物选择最佳媒体类型以返回对传入请求的响应。 

34. HTTP GET 与 HTTP Post 的区别?

HTTP(超文本传输​​协议)只是管理客户端和服务器之间的请求-响应。它作为客户端和服务器之间的请求-响应协议。 

HTTP GET:此方法用于从指定 URL 的相应服务器获取信息或数据。

示例: 
GET/RegisterStudent.asp?user=value1&pass=value2

HTTP POST:此方法用于向各个服务器发送数据或信息。 

示例:
POST/RegisterStudent.asp HTTP/1.1 
主机:www.guru99.com  
user=value1&pass=value2  

GETHTTP POST
其参数包含在 URL 中。其参数包含在正文中。
该方法用于向指定资源请求数据,没有其他作用。此方法用于将数据发送到服务器以创建或更新资源。
它携带附加在 URL 字符串中的请求参数。它在消息正文中携带请求参数,使其成为从客户端向服务器发送数据或信息的更安全的方式。
使用 GET 的请求方法是可缓存的。使用 POST 的请求方法不可缓存。
GET 请求不如 POST 安全。Post 请求比 GET 更安全。
GET 方法对数据类型有限制,只允许使用 ASCII 字符。这种方法对数据类型没有限制,也允许二进制数据。
URL 中的每个人都可以看到数据。URL 中不显示数据。它存在于有效载荷中。

35. Web API 中的 CORS 是什么?

Web API面试题解析:CORS(跨源资源共享)基本上是一种机制,它允许人们在浏览器中从一个网站向另一个网站发出请求,这通常是另一种称为 SOP(同源策略)的策略所不允许的。它支持客户端或浏览器和服务器之间的安全跨域请求和数据传输。这里,跨域请求意味着来自不同源的请求。CORS 只是解决了 JavaScript 的同源限制。可以使用相应的 Web API 包或 OWIN 中间件为 Web API 启用 CORS。 

36. 验证页面上所有控件的名称方法?

Page.Validate()

37、API的URL中可以传入哪些参数?

上下文键、文档键或任何启动 API 以命中确切端点的参数都是少数可以在 URL 中传递以定义完整端点的参数。  

38. DelegatingHandler 有什么用?

DelegatingHandler 用于在 ASP.NET Web API 中开发自定义的服务器端 HTTP 消息处理程序。它用于在 Web API 中路由之前表示消息处理程序。 

39. Web API 使用哪个库进行 JSON 序列化?

Web API 使用 Json.NET 库进行 JSON 序列化。 

40. Web API 中使用HttpError 处理错误的解释方法?

CreateErrorResponse 是一种扩展方法,可用于 Web API 控制器方法中以返回错误代码和错误消息。它创建一个 HttpError 对象,然后将它包装在一个 HttpResponseMessage 对象中。 

41. Web API常见面试题有哪些:如何对 Web API 进行单元测试?

使用 Fiddler 等 Web API 工具,我们可以在 Web API 中执行单元测试。Fiddler 基本上是任何浏览器的免费调试代理,可用于编写和执行对 Web API 的各种 HTTP 请求并检查 HTTP 响应。它仅用于测试 Restful Web 服务。它允许在浏览器接收请求和响应之前检查和检查传入和传出数据以监视和修改请求和响应。下面给出了 fiddler 需要做的一些设置:

Fiddler – Compose Tab -> Enter Request Headers -> Enter Request Body 然后执行。

Web API面试题和答案合集结论

42. 结论

Web API 是一个可扩展的框架,它为我们提供来自服务器的信息,用于开发 ASP.NET。它完全基于 Http,并且易于以 REST-ful 方式定义、公开和使用。它被认为是在 .NET 框架上开发 RESTful 应用程序的理想平台。从以上 Web API 面试问答中,你可以了解更多关于 Web API、其重要性、它的好处等。  

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: