1、在app.module.ts引用HttpModul,并在imports内引用。截图如下:
![顶部引用](http://upload-images.jianshu.io/upload_images/7191041-36a0326c803ebf2e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![ngModule内引用](http://upload-images.jianshu.io/upload_images/7191041-772f6e2986656380.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2、在src目录下新建http服务。命令行:ionic g provider HttpService
3、http-service.ts的代码如下:
import { Injectable } from '@angular/core'; import { Http, Response, Headers, RequestOptions } from '@angular/http'; import 'rxjs/add/operator/toPromise'; @Injectable() export class HttpService { private rootUrl: string; constructor(private http: Http) { this.rootUrl = AppConfig.appUrl(); } public get(url: string, paramObj: any) { return this.http.get(url + this.toQueryString(paramObj)) .toPromise() .then(res => this.handleSuccess(res.json())) .catch(error => this.handleError(error)); } public post(url: string, paramObj: any) { let headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded'}); return this.http.post(url, this.toBodyString(paramObj), new RequestOptions({headers: headers})) .toPromise() .then(res => this.handleSuccess(res.json())) .catch(error => this.handleError(error)); } public postBody(url: string, paramObj: any) { let headers = new Headers({'Content-Type': 'application/json'}); return this.http.post(url, paramObj, new RequestOptions({headers: headers})) .toPromise() .then(res => this.handleSuccess(res.json())) .catch(error => this.handleError(error)); } private handleSuccess(result) { if (result && !result.success) {//由于和后台约定好,所有请求均返回一个包含success,msg,data三个属性的对象,所以这里可以这样处理 console.log(result.msg);//这里使用ToastController } return result; } private handleError(error: Response | any) { let msg = '请求失败'; if (error.status == 0) { msg = '请求地址错误'; } if (error.status == 400) { msg = '请求无效'; console.log('请检查参数类型是否匹配'); } if (error.status == 404) { msg = '请求资源不存在'; console.error(msg+',请检查路径是否正确'); } console.log(error); console.log(msg);//这里使用ToastController return {success: false, msg: msg}; } /** * @param obj 参数对象 * @return {string} 参数字符串 * @example * 声明: var obj= {'name':'小军',age:23}; * 调用: toQueryString(obj); * 返回: "?name=%E5%B0%8F%E5%86%9B&age=23" / private toQueryString(obj) { if(obj == null){ return ""; } let ret = []; for (let key in obj) { key = encodeURIComponent(key); let values = obj[key]; if (values && values.constructor == Array) {//数组 let queryValues = []; for (let i = 0, len = values.length, value; i < len; i++) { value = values[i]; queryValues.push(this.toQueryPair(key, value)); } ret = ret.concat(queryValues); } else { //字符串 ret.push(this.toQueryPair(key, values)); } } return '&' + ret.join('&'); } /* * * @param obj * @return {string} * 声明: var obj= {'name':'小军',age:23}; * 调用: toQueryString(obj); * 返回: "name=%E5%B0%8F%E5%86%9B&age=23" */ private toBodyString(obj) { let ret = []; for (let key in obj) { key = encodeURIComponent(key); let values = obj[key]; if (values && values.constructor == Array) {//数组 let queryValues = []; for (let i = 0, len = values.length, value; i < len; i++) { value = values[i]; queryValues.push(this.toQueryPair(key, value)); } ret = ret.concat(queryValues); } else { //字符串 ret.push(this.toQueryPair(key, values)); } } return ret.join('&'); } private toQueryPair(key, value) { if (typeof value == 'undefined') { return key; } return key + '=' + encodeURIComponent(value === null ? '' : String(value)); }
4、将http-service.ts引入到app.module.ts里面,并声明,截图如下:
![顶部引用](http://upload-images.jianshu.io/upload_images/7191041-0b069d8f959dd9f1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![声明](http://upload-images.jianshu.io/upload_images/7191041-5bc2259675f189a3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5、在app目录下,新建app.config.ts用于定义全局变量、域名等信息(注意:这个ts文件不需要在app.module.ts引入),截图如下:
![后台数据接口的域名](http://upload-images.jianshu.io/upload_images/7191041-dd4e05b97df57c61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
6、在http-service.ts引入app.config.ts,截图如下:
![引入config](http://upload-images.jianshu.io/upload_images/7191041-1257c5099f5a2c57.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
7、在providers目录下的http-service.ts写入获取的数据接口
(注意:this.rootUrl在app.config.ts设置了本地域名,压缩提交前,需要修改成外网域名),截图如下:
![登录接口](http://upload-images.jianshu.io/upload_images/7191041-01c3463584686e47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
8、在login.ts上面引入服务,截图如下:
![http服务](http://upload-images.jianshu.io/upload_images/7191041-a5c8b5fb2995667c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![http服务](http://upload-images.jianshu.io/upload_images/7191041-3c8350d06ec3db6b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
9、登录提交数据表单验证:
- Login.html的表单,需要用户提交的信息,截图如下:
![ionic2表单验证](http://upload-images.jianshu.io/upload_images/7191041-33c938b9bc959068.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- Login.ts写入对应表单的信息验证,截图如下:
![ionic2表单验证](http://upload-images.jianshu.io/upload_images/7191041-34b7419b628673ca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
10、在login.ts新建login()方法,获取用户提交的参数userObj.??,与数据接口的参数匹配,截图如下:
![后台数据与前台输出数据对接](http://upload-images.jianshu.io/upload_images/7191041-720418ca1360e601.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
11、判断是否获取成功,若成功进行下一步操作,否则弹出错误信息,截图如下:
![判断获取数据是否成功](http://upload-images.jianshu.io/upload_images/7191041-7ca7b8f76297e7b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)