创建http
-
此篇博文已旧,新版看这里
-
第一步在src根目录新建一个providers文件夹,在这个文件夹新建一个HttpService.ts文件
HttpService.ts
文件代码如下
import {Injectable} from '@angular/core';
import {Http, Response, Headers, RequestOptions} from '@angular/http';
import 'rxjs/add/operator/toPromise';@Injectable() export class HttpService { constructor(private http: Http) { } 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三个属性的对象,所以这里可以这样处理 alert(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); alert(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) { 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)); } }
-
第二步把
把`HttpService.ts`加入到`app.module.ts`HttpService.ts
加入到app.module.ts
,如下图
使用http
-
第一步,如下图在providers文件夹下新建一个
chConstants.ts
文件,这个文件用来存放一些配置信息,如后台服务地址,用户默认头像等一些配置信息等
-
第二步,我们新建了一个
`HomeService.ts`HomeService.ts
,用于把Home这个模块的所有请求再封装一下,实际开发就是一人负责一个模块
- 最后我们在
home.ts
文件中使用HomeService
最终调用http
最后
- 为了方便测试,我在本地新建一个json文件,如下图1
- 把
APP_SERVE_URL
地址改为本地,如下图2 - 测试效果如下图3,说明我们的http服务可以跑通了
总结与后台SpringMvc交互
我的HttpService.ts
定义了三个方法:get,post,postBody,其中get很简单就是通过url传递参数,post和postBody这两个方法的Headers不一样.这主要是和后台接受的参数有关了.
我后台使用SpringMvc,如下图定义了三个接口,我们分别命名为方法1,2,3
结论
get请求
会进入方法1和方法2,不进入方法3.使用tomcat低于版本8.0,方法1和方法2参数如果包含中文则会乱码.
post请求
当Content-Type为'application/x-www-form-urlencoded',参数类型如"name=%E5%B0%8F%E5%86%9B&age=23",会进入方法1和方法2,不会进入方法3
当Content-Type为'application/json',参数类型如{'name':'小军',age:23} ,参数是json,会正常进入方法3,进入方法1和方法二参数都为null
所以我们传的参数类型不同,后台也要做相应的接受处理
网友评论
getData(data,page){
console.log(data);
console.log(page);
if(data.token =='' || data.token ==null || data.token == undefined){
return this.httpService.get(APP_SEVER_URL+'/api/getApkList/?page='+page,data);
}else {
console.log(APP_SEVER_URL+'/api/getApkList/'+data.token+'?page='+page,data);
return this.httpService.get(APP_SEVER_URL+'/api/getApkList/'+data.token+'?page='+page,data);
}
}
core.es5.js:1084 ERROR Error: Uncaught (in promise): Error: No provider for Http!
Error: No provider for Http!
return this.http.get(url + this.toQueryString(paramObj))
.toPromise()
.then(res => this.handleSuccess(res.json()))
.catch(error => this.handleError(error));
}
4.把HttpService.ts加入到app.module.ts 5.需要调用的文件加入HttpService.ts,声明HttpService, 然后调用: this.httpServce.get('请求的连接',null).then(res=>{
console.log(res);
})
以上,步骤是否正确?
this.http.request(url, options).timeout(//请求超时时间,单位为毫秒).subscribe(res => {
//
}, err => {
if (err instanceof TimeoutError) {
//请求超时异常
}
});
2.方式二,后端统一返回数据格式.如返回的数据均有success,data,msg三个字段