ionic3 http請求

前言

隨便一個前端工程都離不開請求數據,剛開始我做demo的時候拿著就開始寫靜態頁面。后來發現這個東西,我連請求接口都不會,然后查各種資料。最后成功請求到數據。這里面也遇到過很多的坑。好在在學習的過程中遇坑填坑。沒把自己埋里面。

環境介紹

  • ionic版本 3.10.1
  • 項目采用命令行創建(PS:類型tabs)

本文功能點

  • 基本的http請求配置及使用(本文的重點介紹。下面的功能點都可以根據本文的demo來改進。)
  • 請求超時問題
  • jwt請求headers token設置
  • 請求時候loading設置 使用ionic LoadingController組件
  • 請求錯誤提示。使用ionic AlertController 組件
  • 請求類型JSON、formData設置(PS:本文所使用的類型是JSON。如果想使用formData headers 設置更改為“ x-www-form-urlencoded”即可,如果需要的話,還需要對參數做處理)

命令行完成后的目錄接口(先貼出來以后方便對比)

一個干凈的tabs目錄結構

1.在src 目錄下創建一個目錄來存放http請求相關的文件,如下圖(PS:我這里是創建的一個名為providers的文件夾)

image.png

2.在providers目錄下新建一個名為HttpService.ts的文件,代碼如下:(PS:復制可用)

import {Injectable} from '@angular/core';
import {Http, Response, Headers, RequestOptions} from '@angular/http';
import 'rxjs/add/operator/toPromise';

 @Injectable()
 export class HttpService {
   loader: any;
    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) {
 //x-www-form-urlencoded
 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.resultCode != "0000") {
   let params = {
        title: "錯誤!",
        subTitle: result.message,
   }
 }
 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+',請檢查路徑是否正確');
 }
 let params = {
      title: "錯誤!",
      subTitle: msg,
 }
 return {success: false, msg: msg};
 }

 /**
* @param obj 參數對象
* @return {string} 參數字符串
* @example
*  聲明: var obj= {'name':'zhangsan',sex:1};
*  調用: toQueryString(obj);
*  返回: "?name=zhangsan&age=1"
*/
 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));
   }
}
let str = obj?'?' + ret.join('&'):""
return str;

}

 private toQueryPair(key, value) {
 if (typeof value == 'undefined') {
   return key;
 }
 return key + '=' + encodeURIComponent(value === null ? '' : String(value));
 }    
}

3.需要更改src目錄下的app.module.ts文件。稍微修改一下,如下圖

app.module.tsg

進行到這一步的時候,配置這塊兒就基本完成了。然后我們得把項目跑起來。測試一請求是否能成功。驗證接口這塊兒。我找了中國氣象局的免費API做測試.地址如下:

http://www.weather.com.cn/data/sk/101010100.html

4.使用我們的http配置

4.1 在homePage頁面新建一個按鈕。綁定一個事件(PS:homePage路徑:src/pages/home/home.html);修改效果入下

home.html

上圖是有一點問題的。我截圖的時候沒有注意。homeService.ts此文件。大家不用在意。不會影響這個例子的運行的
4.2 在src/pages/home/home.ts文件中加入事件的方法。home.ts文件代碼如下:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { HttpService } from '../../providers/HttpService';

 @Component({
  selector: 'page-home',
  templateUrl: 'home.html'
 })
   export class HomePage {

 constructor(public navCtrl: NavController,private httpService:HttpService) {

}
getTest(){
this.httpService.get("http://www.weather.com.cn/data/sk/101010100.html",null).then(res=>{
    console.log(res);
});
}

  }
image.png

到這里的時候基本完成了。可以進入你的ionic項目目錄,執行ionic serve命令。啟動此項目。看效果。最終效果如圖

image.png

這樣的話就是請求成功的!
這個是最基本的配置。精簡了很多功能。這里就不贅述了。我貼出我完成的httpservice.ts文件。給大家注釋下就可以。
功能點如下:

  • 請求超時問題
  • jwt請求headers token設置
  • 請求時候loading設置 使用ionic LoadingController組件
  • 請求錯誤提示。使用ionic AlertController 組件
  • 請求類型JSON、formData設置(PS:本文所使用的類型是JSON。如果想使用formData headers 設置更改為“ x-www-form-urlencoded”即可,如果需要的話,還需要對參數做處理)
    自己可參照我下圖根據代碼,根據本文所創建的基礎demo做相應的更改以達到所期待的效果


    image.png

為了更好的管理每個模塊的HTTP請求。建議沒一個模塊簡歷一個 moduleNameService。這里也不贅述了。直接貼出相應代碼
1.統一管理請求路徑。如下圖

image.png

2.moduleNameService.ts

image.png

3.使用方法(PS:紅色框外的代碼)

image.png

好了。到這里我http請求所遇到的問題都有描述了。由于我也是才入坑ionic。代碼寫的不是很規范。各位看官擔待

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容