Angular 5 建立 HttpClient 与后台通信

阅读时长 11 分钟读完

近年来,前端开发变得越来越复杂,特别是与后台通信的方面。没有一个优秀的库来支持这一方面的开发,很多开发者只能使用浏览器自带的 XMLHttpRequest 或者 JQuery 的 ajax 方法来实现与后台的通信。这种方法会让前端开发变得混乱,不易维护。Angular 5 发布了一个新的库来处理这一方面的问题,它是 HttpClient 。

HttpClient 概述

HttpClient 是 Angular 5 中用来处理和后台交互的库。它的 API 是面向流的,它支持 JSON 格式的数据以及类型,还能处理 HTTP 请求和响应,缓存机制并支持拦截器。HttpClient 是 Angular 的一部分,所以如果你使用 Angular,HttpClient 就已经存在于你的工程中了。

HttpClient 的使用

前提:假设有一个后台服务,它有一个 GET 方法,它返回 JSON 类型的数据。

第一步,导入 HttpClient 模块。

第二步,在 AppModule 中配置 HttpClient 模块。

-- -------------------- ---- -------
-----------
  -------- -
    --------------
    ----------------
  --
  ---------- ---
  ---------- --------------
--
------ ----- --------- - -

第三步,实现一个服务来处理请求。

-- -------------------- ---- -------
------ - ---------- - ---- ----------------
------ - ---------- - ---- -----------------------

-------------
------ ----- ----------- -

  ------------------- ----- ----------- - -

  --------- -
    ------ ---------------------------
  -

-

getData 方法向后台发送一个 GET 请求,它请求的地址是 '/api/data' ,并返回一个 RxJS 可观察对象。RxJS 是 Angular 中用来处理异步数据流的框架。

第四步,订阅可观察对象并处理响应。

-- -------------------- ---- -------
------ - --------- - ---- ----------------
------ - ----------- - ---- -----------------

------------
  --------- -----------
  --------- -
    ----
      --- ----------- ---- -- -------- ---- -------
    -----
  --
--
------ ----- ------------ -

  ----- ------

  ------------------- ------------ ------------ --

  ---------- -
    ----------------------------------------- -- -
      --------- - -----
    ---
  -

-

这里,我们在 AppComponent 中订阅了可观察对象,并在响应到达时更新了列表。

HttpClient 格式

HttpClient 提供了一系列的方法来处理不同的 HTTP 请求方法。这些方法分别是:

  • delete
  • get
  • head
  • jsonp
  • options
  • patch
  • post
  • put

这些方法的参数都相同,都是一个字符串类型的 url ,和一个可选的 options 对象。options 对象包含一些方法特有的参数。这个对象中的常见属性有:

  • headers:请求头的配置。
  • observe:指定响应类型的观察者类型。
  • params:请求参数。
  • reportProgress:是否报告上传或下载的进度。
  • responseType:响应的类型。
  • withCredentials:是否跨域请求。

HttpClient 的错误处理

当请求出错时,HttpClient 会返回一个错误信息的可观察对象。如果你希望应用程序可以处理错误,你应该订阅错误信息。你可以使用 catchError 操作符来处理这些错误。

-- -------------------- ---- -------
------ - --------- - ---- ----------------
------ - ----------- - ---- -----------------
------ - ---------- - ---- -----------------

------------
  --------- -----------
  --------- -
    ---- -------------------- ---------------- ------------ --------
    --- -------------
      --- ----------- ---- -- -------- ---- -------
    -----
  --
--
------ ----- ------------ -

  ------------- -------
  ----- ------

  ------------------- ------------ ------------ --

  ---------- -
    --------------------------------
      ------------------ -- -
        ----------------- - ------------
        ------ ---
      --
    ---------------- -- -
      --------- - -----
    ---
  -

-

在这个例子中,我们利用了 catchError 操作符来处理错误。当 handleError 被执行时,我们简单地将 errorMessage 赋值为一个适当的错误消息,并将 data 赋值为空数组。

HttpClient 的拦截器

在我们的应用程序中,我们可能需要在所有 HTTP 请求之前执行某些操作,例如添加身份验证信息。这正是 HTTP 拦截器的用武之地。

为了添加一个拦截器,我们首先需要定义一个拦截器类。

-- -------------------- ---- -------
------ - ---------- - ---- ----------------
------ - ---------------- ------------ ----------- - ---- -----------------------

-------------
------ ----- --------------- ---------- --------------- -

    -------------- ----------------- ----- ------------ -
      ----- --------- - ----------------
      ----- ------- - -----------
        -------- -------------------------------- ----------
      ---
      ------ ---------------------
    -

-

在这个例子中,我们定义了一个 AuthInterceptor。它实现了 HttpInterceptor 接口,接口要求我们实现一个拦截方法 intercept 。intercept 方法首先检查是否有一个有效的身份验证令牌,如果有则将其添加到请求的 headers 中,同时克隆该请求。最后,返回处理函数的下一个函数的 handle 方法所返回的 observable。

这个 AuthInterceptor 类仅仅是一个简单的例子,你可以根据你的需要来添加更多的拦截器。

为了让 HttpClient 在每个请求中加入我们的拦截器,我们必须在 AppModule 中的 HttpClient 模块引入时添加拦截器类。

-- -------------------- ---- -------
------ - ----------------- ----------------- - ---- -----------------------
------ - --------------- - ---- ---------------------

-----------
  -------- -
    --------------
    ----------------
  --
  ---------- -
    - -------- ------------------ --------- ---------------- ------ ---- -
  --
  ---------- --------------
--
------ ----- --------- - -

在这个例子中,我们添加了一个 HTTP_INTERCEPTORS 依赖注入提供程序,并通过它来添加 AuthInterceptor 来指定我们要添加的拦截器类。multi 属性是必需的,因为我们可能有多个拦截器。

HttpClient 的缓存机制

HttpClient支持缓存响应数据,以便下一次调用该请求时,可以在不重新执行整个请求的情况下返回该响应。这可以提高应用程序的响应速度。

为了实现缓存,我们需要导入 HttpClient 的 HttpCacheService。

-- -------------------- ---- -------
------ - ---------------- - ---- -----------------------
------ - ----------------- - ---- -----------------------
------ - ------------------ - ---- ------------------------

-----------
  -------- -
    --------------
    ----------------
  --
  ---------- -
    -----------------
    - -------- ------------------ --------- ------------------- ------ ---- -
  --
  ---------- --------------
--
------ ----- --------- - -

然后我们需要实现一个 CachingInterceptor 类。

-- -------------------- ---- -------
------ - ---------- ------------ ---------------- ----------- - ---- -----------------------
------ - ---------- - ---- ----------------
------ - ---------- - ---- ------------------
------ - --- - ---- -----------------
------ - ---------------- - ---- -----------------------

-------------
------ ----- ------------------ ---------- --------------- -
  ------------------- ------------- ----------------- --

  -------------- ----------------- ----- ------------- -------------------------- -
    -- ---------------------------
    -- ----------- --- ------ -
      ------ -----------------
    -
    -- -----------------
    ----- -------------- - ---------------------------
    -- ---------------- -
        ------ ------------------------------
    -
    -- -------------
    ------ ----------------
      ------
        --------- -- -
        -- ------ ---------- ------------- -
            -------------------------- -------
        -
      --
    --
  -
-

CachingInterceptor 来管理我们的缓存。 在拦截器的构造函数中,我们注入了一个名为 HttpCacheService 的服务。 对于单个请求,它首先检查缓存是否包含请求的响应数据。如果缓存了该响应,则它会立即返回缓存的响应。否则,它会将请求传递给处理程序,等待网络响应,并缓存响应以供以后使用。

总结

HttpClient 是 Angular 中用来处理和后台交互的库。 它支持 JSON 数据,处理 HTTP 请求和响应,并支持拦截器。除此之外,HttpClient还支持缓存机制、异常处理等。通过学习这些内容,我们可以掌握如何顺畅地将Angular应用程序与服务器集成起来。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65a6241aadd4f0e0ffed2afd

纠错
反馈