当前位置: 首页 > 知识库问答 >
问题:

HttpModule和HttpClientModule之间的差异

莘睿
2023-03-14

使用哪一个来构建模拟 Web 服务来测试 Angular 4 应用?

共有3个答案

韩阳飙
2023-03-14

这是一个很好的参考,它帮助我将我的< code>http请求切换到< code>httpClient。

它根据差异比较了两者,并提供了代码示例。

这只是我在项目中将服务更改为httpclient时处理的一些差异(借用我提到的文章) :

import {HttpModule} from '@angular/http';
import {HttpClientModule} from '@angular/common/http';
 this.http.get(url)
      // Extract the data in HTTP Response (parsing)
      .map((response: Response) => response.json() as GithubUser)
      .subscribe((data: GithubUser) => {
        // Display the result
        console.log('TJ user data', data);
      });
 this.http.get(url)
      .subscribe((data: GithubUser) => {
        // Data extraction from the HTTP response is already done
        // Display the result
        console.log('TJ user data', data);
      });

注意:您不再需要显式提取返回的数据;默认情况下,如果您返回的数据是JSON类型,那么您不必做任何额外的事情。

但是,如果需要解析任何其他类型的响应,如文本或blob,请确保在请求中添加responseType。像这样:

 this.http.get(url, {responseType: 'blob'})
      .subscribe((data) => {
        // Data extraction from the HTTP response is already done
        // Display the result
        console.log('TJ user data', data);
      });

我还使用拦截器为每个请求、引用添加我的授权令牌。

像这样:

@Injectable()
export class MyFirstInterceptor implements HttpInterceptor {

    constructor(private currentUserService: CurrentUserService) { }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        // get the token from a service
        const token: string = this.currentUserService.token;

        // add it if we have one
        if (token) {
            req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) });
        }

        // if this is a login-request the header is 
        // already set to x/www/formurl/encoded. 
        // so if we already have a content-type, do not 
        // set it, but if we don't have one, set it to 
        // default --> json
        if (!req.headers.has('Content-Type')) {
            req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') });
        }

        // setting the accept header
        req = req.clone({ headers: req.headers.set('Accept', 'application/json') });
        return next.handle(req);
    }
}

这是一个相当不错的升级!

公羊绪
2023-03-14

不想重复,只是用其他方式总结(新HttpClient中添加的功能):

  • 从JSON自动转换为对象
  • 响应类型定义
  • 事件触发
  • 标题的简化语法
  • 拦截器

我写了一篇文章,其中我介绍了旧“http”和新“Http客户端”之间的区别。目标是以最简单的方式解释它。

浅谈Angular中的新HttpClient

郝君博
2023-03-14

如果您使用的是Angular 4.3. x及更高版本,请使用HttpClientModule中的HttpClient类:

import { HttpClientModule } from '@angular/common/http';

@NgModule({
 imports: [
   BrowserModule,
   HttpClientModule
 ],
 ...

 class MyService() {
    constructor(http: HttpClient) {...}

它是 http 的升级版本,从 @angular/http 模块进行了以下改进:

  • 拦截器允许将中间件逻辑插入管道
  • 不可变请求/响应对象
  • 请求上传和响应下载的进度事件

您可以在内幕指南中阅读有关其工作原理的信息,了解拦截器和角度中的 Http 客户端机制。

  • 类型化、同步响应正文访问,包括对 JSON 正文类型的支持
  • JSON 是假定的默认值,不再需要显式解析
  • 请求后验证

今后,旧的http客户端将被弃用。以下是提交消息和官方文档的链接。

还要注意,旧的超文本传输协议是使用Http类令牌而不是新的HttpClient注入的:

import { HttpModule } from '@angular/http';

@NgModule({
 imports: [
   BrowserModule,
   HttpModule
 ],
 ...

 class MyService() {
    constructor(http: Http) {...}

此外,新的 HttpClient 似乎需要在运行时使用 tslib,因此您必须在运行时安装它 npm i tslib 并更新 system.config.js 如果您使用的是 SystemJS

map: {
     ...
    'tslib': 'npm:tslib/tslib.js',

如果您使用SystemJS,则需要添加另一个映射:

'@angular/common/http': 'npm:@angular/common/bundles/common-http.umd.js',
 类似资料:
  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 问题内容: package main 该代码可以很好地工作。但是,如果按如下所示更改方法,则会导致死循环。区别在于将替换为。为什么? 问题答案: 因为程序包检查要打印的值是否具有方法(或换句话说:是否实现接口),如果是,则将调用它以获取值的表示形式。 软件包doc中对此进行了说明: […]如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(

  • 我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。 我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。 在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该

  • 我是Hadoop的新手。我正在浏览专业Hadoop解决方案的书,以获得一些关于Hadoop和生态系统的知识。我想澄清HDFS和HBase之间的主要区别是什么。我理解的方式就像两者都是存储系统。它们的区别只是在访问数据方面。HBase通过非关系型数据库访问数据,HDFS使用计算框架(MapReduce)处理数据。如果是这种情况,为什么我们不能只有一个存储HDFS或HBase。根据需求,他们将插入和插

  • 有人能解释一下 和 我不知道确切的意思。