1 HttpClient介绍

  HttpClient时Http的演进,注意:Http在@angular/http中,而HttpClient在@angular/common/http中; 使用前需要在模块级别导入HttpClientModule,通常的做法是在核心模块中导入,在将核心模块导入到主模块中

2 HttpClient特性说明

  2.1 默认JSON解析

    HttpClient使用的默认数据格式就是JSON,所以不需要在利用map进行数据格式转化了,即:http.get(url).map(res => res.json()).subscribe(...)将被http.get(url).subscribe(...)代替;

  2.2 拦截器

    待更新......

    2018-3-12 15:00:20

    参考博文:点击前往

3 HttpClient编程步骤

  3.1 导入HttpClientModule

    在模块级别导入HttpClientModule

    技巧01:直接在主模块中导入即可,但是一般的做法是将一些只导入一次的模块放到一个核心模块中,再将核心模块导入到主模块中即可

import { NgModule,  SkipSelf, Optional } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HeaderComponent } from './header/header.component';
import { MainComponent } from './main/main.component';
import { FooterComponent } from './footer/footer.component'; import 'hammerjs';
import 'rxjs/Rx';
import 'rxjs/add/operator/map';
import { SidenavComponent } from './sidenav/sidenav.component';
import { SharedModule } from '../shared/shared.module';
import { RouterModule } from '@angular/router';
import { HttpModule } from '@angular/http';
import { HttpClientModule } from '@angular/common/http'; @NgModule({
imports: [
BrowserAnimationsModule,
SharedModule,
RouterModule,
HttpModule,
HttpClientModule
],
declarations: [
HeaderComponent,
MainComponent,
FooterComponent,
SidenavComponent
],
exports: [
HeaderComponent,
MainComponent,
FooterComponent,
SidenavComponent
]
})
export class CoreModule {
constructor( @Optional() @SkipSelf() parent: CoreModule) {
if (parent) {
throw new Error('核心模块已经加载了,请勿重复加载');
}
}
}

核心模块

    坑01:和表单相关的模块不能在核心模块中导入,只能在共享模块中导入,再将需要用到表单的模块中导入共享模块

  3.2 创建一个Http服务

    创建一个服务文件专门来存放一些执行Http请求的方法,在该服务中依赖注入 HttpClient,利用HttpClient对象去执行Http请求

    坑01:HttpClient对象提供的get、post、delete、put方法的返回值都是一个已经转化成了JSON数据的JavaScript对象,如果想获取该对象中的某个属性就必须使用  对象名[ ‘属性名’ ]  这样的格式,不能使用   对象名.属性名  这种格式;如果使用   对象名.属性名   这种格式时就必须在调用HttpClient对象提供的方法时通过泛型来对响应数据进行类型指定,例如:

      

    

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ClientBaseInfo, responseResult } from '../model/ClientBaseInfo'; @Injectable()
export class TestService { constructor(
private http: HttpClient
) {} testGet() {
return this.http.get<responseResult<ClientBaseInfo>>('http://127.0.0.1:8888/dev/client/findAll');
} }

Http服务

  3.3 依赖注入Http服务

    在模块级别依赖注入自己定义的Http服务

    

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Test01Component } from './test01/test01.component';
import { CoreModule } from '../core/core.module';
import { TestHomeComponent } from './test-home/test-home.component';
import { SharedModule } from '../shared/shared.module';
import { TestRoutingModule } from './test-routing.module';
import { Test02Component } from './test02/test02.component';
import { Test03Component } from './test03/test03.component';
import { TestDemoComponent } from './test-demo/test-demo.component';
import { HttpModule } from '@angular/http';
import { TestService } from './test.service'; @NgModule({
imports: [
SharedModule,
TestRoutingModule
],
declarations: [
TestHomeComponent,
Test01Component,
Test02Component,
Test03Component,
TestDemoComponent
],
exports: [
Test01Component
],
providers: [
TestService
]
})
export class TestModule { }

模块级别依赖注入Http服务

  3.4 执行Http请求

    在组件中调用Http服务提供的方法发送Http请求

    

    坑01:当响应数据的结果是多个同类型的对象组成的实例组成的列表时,如果想将这个列表赋值给一个指定了类型的的列表是会报类型错误的,例如:响应数据是 [ a, b, c, d ]  其中 a b c d 都是 Person类 的实例,现在将 [ a , b, c, d ] 赋值给 result 其中 result 的类型是 Person[] , 这时候就会包类型错误 -> 不能将类型“Person”分配给类型“Person[]”,但是如果将result类型改成Person就会编译成功,而且还可以在视图中把result当成一个列表来使用;具体原因不详。

4 HttpClient实现CRUD实例

  在实际的生产环境中是不会删除数据的,只会修改数据的有效状态,所以不会用到DELETE

import { Injectable } from '@angular/core';
import { HttpParams, HttpClient, HttpHeaders } from '@angular/common/http';
// import { Http } from '@angular/http'
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';
import { ClientBaseInfo, ResponseResult } from '../model/ClientBaseInfo'; @Injectable()
export class ClientService {
constructor(
// private http: Http
private http: HttpClient
) {} // 查询所有的客户信息
getClientInfo() {
// 利用Http实现
// return this.http.get('http://localhost:3333/clientBaseInfo').map(result => result.json()); // 利用HttpClient实现
// return this.http.get('http://localhost:3333/clientBaseInfo');
return this.http.get<ResponseResult<ClientBaseInfo>>('http://127.0.0.1:8888/dev/client/findAll');
} // 根据姓名查询客户信息
getClientInfoByName(name: string) {
const params = new HttpParams()
.set('name', name);
const headers = new HttpHeaders().set("Content-Type", "application/json"); return this.http
.get<ResponseResult<ClientBaseInfo>>(
'http://127.0.0.1:8888/dev/client/findByName',
{params, headers}
)
} getClientInfoByIdcard(idcard: string) {
const params = new HttpParams()
.set('idcard', idcard);
const headers = new HttpHeaders().set("Content-Type", "application/json");
return this.http.get<ResponseResult<ClientBaseInfo>>(
'http://127.0.0.1:8888/dev/client/findByIdcard',
{params, headers}
);
} // 新增客户信息
createClientInfo(clientBaseInfo: ClientBaseInfo) {
const headers = new HttpHeaders().set("Content-Type", "application/json");
// const body = {
// "name": "郭靖",
// "phone": "12272222616",
// "address": "襄阳城",
// "gender": "男",
// "idcard": "500228199210031925",
// "hometown": "西北边塞",
// "remarks": "降龙十八掌",
// "status": 1
// };
const body = clientBaseInfo;
return this.http.post<ResponseResult<Object>>('http://127.0.0.1:8888/dev/client/create', body, {headers});
} // 修改客户信息
updateClientInfo(clientBaseInfo: ClientBaseInfo) {
const headers = new HttpHeaders().set("Content-Type", "application/json");
// const body = {
// "name": "郭靖",
// "phone": "12272222616",
// "address": "襄阳城",
// "gender": "男",
// "idcard": "500228199210031933",
// "hometown": "西北边塞",
// "remarks": "爱吃烤全羊",
// "status": 1
// };
const body = clientBaseInfo;
return this.http.put<ResponseResult<Object>>('http://127.0.0.1:8888/dev/client/update', body, {headers});
} test(clientBaseInfo: ClientBaseInfo) {
const headers = new HttpHeaders().set("Content-Type", "application/json");
const body = clientBaseInfo;
return this.http.put('http://127.0.0.1:8888/dev/client/update', body, {headers});
} }

Angular22 HttpClient的使用的更多相关文章

  1. HttpClient的替代者 - RestTemplate

    需要的包 ,除了Spring的基础包外还用到json的包,这里的数据传输使用json格式 客户端和服务端都用到一下的包 <!-- Spring --> <dependency> ...

  2. 关于微软HttpClient使用,避免踩坑

    最近公司对于WebApi的场景使用也越来越加大了,随之而来就是Api的客户端工具我们使用哪个?我们最常用的估计就是HttpClient,在微软类库中命名空间地址:System.Net.Http,是一个 ...

  3. 使用HttpClient的优解

    新工作入职不满半周,目前仍然还在交接工作,适应环境当中,笔者不得不说看别人的源码实在是令人痛苦.所幸今天终于将大部分工作流畅地看了一遍,接下来就是熟悉框架技术的阶段了. 也正是在看源码的过程当中,有一 ...

  4. Java的异步HttpClient

    上篇提到了高性能处理的关键是异步,而我们当中许多人依旧在使用同步模式的HttpClient访问第三方Web资源,我认为原因之一是:异步的HttpClient诞生较晚,许多人不知道:另外也可能是大多数W ...

  5. 揭秘Windows10 UWP中的httpclient接口[2]

    阅读目录: 概述 如何选择 System.Net.Http Windows.Web.Http HTTP的常用功能 修改http头部 设置超时 使用身份验证凭据 使用客户端证书 cookie处理 概述 ...

  6. C#中HttpClient使用注意:预热与长连接

    最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...

  7. HttpClient调用webApi时注意的小问题

    HttpClient client = new HttpClient(); client.BaseAddress = new Uri(thisUrl); client.GetAsync("a ...

  8. HttpClient相关

    HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息 HttpClient入门 ...

  9. Atitit.http httpclient实践java c# .net php attilax总结

    Atitit.http httpclient实践java c# .net php attilax总结 1. Navtree>> net .http1 2. Httpclient理论1 2. ...

随机推荐

  1. 15 Python 迭代器和生成器

    什么是迭代 (iterable) 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数 ...

  2. CodeForces-831A-Unimodal Array (水题)

    题目链接 /* Name: Copyright: Author: Date: 2018/5/6 19:34:23 Description: */ #include <iostream> # ...

  3. MySQL_截止昨日南京市所有在职业务员业绩排名-20170116

    #计算南京销售员总业绩排名 数据结果已打乱处理 #职工信息表包含在职和离职两种状态 因此不能以这表当做主表 不然离职人的数据也会出现 以毛利表为主表 销售员限制在昨天在职的销售范围内 且和后面left ...

  4. .NET MVC 异步提交和返回参数

    一.后台页面中的接收方法和返回写法 Jsonresult意味着返回值是json格式,也可以是string或者int等其他类型. Httppost代表只接受Post方法. Mvc中返回Jsonresul ...

  5. java实现sendemail

    <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</arti ...

  6. 使用Json Template在Azure China创建ARM类型的虚拟机

    前面几篇文章介绍过Azure的两种VM的模式,包括ASM和ARM.并且介绍了如何用Azure CLI和PowerShell创建虚拟机.本文将介绍如何采用Json的Template来创建基于ARM的VM ...

  7. 把python2.6升级到python2.7(同样适用于把python2升级到python3)

    在启用https过程中,在生成CSR(证书请求文件)时,报错了,说python2.6已被python团队抛弃了,所以升级python到2.7 话不多说,直接上代码: 步骤1:下载python2.7.1 ...

  8. hihoCoder#1175拓扑排序应用

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了 ...

  9. Spring Boot 集成RabbitMQ

    在Spring Boot中整合RabbitMQ是非常容易的,通过在Spring Boot应用中整合RabbitMQ,实现一个简单的发送.接收消息的例子. 首先需要启动RabbitMQ服务,并且add一 ...

  10. boost的asio接收单路大数据量udp包的方法

    开发windows客户端接收RTP视频流,当h264视频达到1080P 60fps的时候,按包来调用recvfrom的函数压力比较大,存在丢包的问题,windows的完成端口的性能效果当然可以解决这个 ...