Ionic HTTP 请求
Ionic HTTP 请求
Ionic 的 http 请求真的事让我有点小小的懵逼,懵逼树下懵逼果,懵逼树下你和我。因为请求需要带有token验证,但是自己有是一个小白,第一次接触Ionic,根本不知道该怎样去实现,尝试着写,好不容易有点成效,记录一下。
首先说明一下,使用下边方法如果浏览器可以请求到但是真机不行,就看一下这篇博文,可能是这个原因
https://www.cnblogs.com/wjw1014/p/12522263.html
使用工具类
首先在app同级下创建一个文件夹providers,用来存放http请求工具类。
在 providers 文件夹下创建一个 http 文件夹,http文件夹下创建一个 http.ts 文件。
工具类内容如下:
import { HttpClient, HttpResponse } from '@angular/common/http';
import { AppConfig } from './../../app/app.config';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
/*
Generated class for the HttpProvider provider.
See https://angular.io/guide/dependency-injection for more info on providers
and Angular DI.
*/
@Injectable()
export class HttpProvider {
private baseServerUrl = 'http://localhost' //这个地方是请求的baseUrl
constructor(public httpClient: HttpClient) {
//console.log('Hello HttpProvider Provider');
}
/**
* post请求
* @param url 相对路径
* @param params 参数
*/
public post(url, params:any):Observable<any> {
//console.log("此时token:",AppConfig.token)
return this.httpClient.post(this.baseServerUrl + url,params,{
headers:{
'Content-Type': 'application/json',
'cookie': AppConfig.token,
'Request-Origin': 'app'
}
})
}
/**
* get方法
* @param url 相对路径
* @param params 参数
*/
public get(url,params:any):Observable<any>{
//console.log("此时token:",AppConfig.token)
return this.httpClient.get(this.baseServerUrl + url,{
headers:{
'Content-Type': 'application/json',
'cookie': '' + AppConfig.token,
'Request-Origin': 'app'
},
params:params
})
}
}
创建存放token的文件
因为我们需要进行身份认证,也就是请求的时候需要携带token,所以说我创建了一个文件用来存放登录成功后返回的token。
在app目录下创建一个 app.config.ts 文件,文件内容如下:
export class AppConfig{
public static token:string = '';
}
当登录成功之后,把token放到这个值里面,然后下次携带token去后台请求数据的token就从这里拿。
注入依赖
在 app.module.ts 文件中注入各种依赖包
import { HttpProvider } from '../providers/http/http';
import { HttpClientModule, HttpClientJsonpModule } from '@angular/common/http';
注入
imports: [
···
HttpClientModule,
],
注入
providers: [
···
HttpProvider,
],
使用
在需要进行http请求的页面,导入包
import {HttpProvider} from './../../providers/http/http';
import { AppConfig } from './../app.config';
在构造函数中注入依赖
constructor( private httpProvider: HttpProvider,) {}
http get 请求
this.httpProvider.get('/getCheckCode',{}).subscribe((resp => {
if (!resp.success) {
return;
}
console.log("返回数据",resp);
}), error => {
console.error(error);
})
http post 请求
let pa= {
'username': 'wjw',
'password': 'wjw'
}
console.log(pa)
this.httpProvider.post('/login',pa ).subscribe((resp: any) => {
console.log('登录成功',resp);
AppConfig.token = resp.result.token // 登录成功的token存起来
}, error => {
console.log('登录失败');
})
大体就是这个样子。
优化一下
上边是在登录成功之后直接手动去拿返回的token,可以写一个拦截器拿。
在 app 文件夹同级创建一个 interceptors 文件夹存放 拦截器文件。
创建一个 interceptor.config.ts 文件
import { TokenInterceptor } from './token-interceptor';
import { HTTP_INTERCEPTORS } from "@angular/common/http";
export const httpInterceptorProviders = [
{ provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true },
]
在创建一个 token-interceptor.ts 文件
import { HttpProvider } from './../providers/http/http';
import { AppConfig } from './../app/app.config';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse, HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";
import { tap } from 'rxjs/operators';
// import { NavController } from 'ionic-angular';
export class TokenInterceptor implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
return next.handle(req).pipe(tap((event:HttpResponse<any>)=>{
if(event instanceof HttpResponse){
if (event.headers && event.headers.has('Authorization')) { // 这个地方要根据实际去改
let token = event.headers.get('Authorization');
AppConfig.token = token;
console.log('token------------->', token);
}
}
},error=>{
console.log('请求失败------------->');
if (error.status == 401) {
//token失效 重新登录
return;
}
}));
}
}
在 app.module.ts 文件中使用
import { httpInterceptorProviders } from '../interceptors/interceptor.config';
providers: [
...
httpInterceptorProviders,
],
OK了! 在登录成功的时候就不需要我们再去拿token赋值了,相关那段代码删掉就行了。
【重要说明】博文仅作为本人的学习记录,论点和观点仅代表个人而不代表技术的真理,目的是自我学习和有幸成为可以向他人分享的经验,因此有错误会虚心接受改正,但不代表此刻博文无误!
【博客园地址】叫我+V : http://www.cnblogs.com/wjw1014
【CSDN地址】叫我+V : https://wjw1014.blog.csdn.net/
【Gitee地址】叫我+V :https://gitee.com/wjw1014
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!