美文网首页ionic开发ionic3.0Ionic
ionic3 教程(五)基本的网络请求

ionic3 教程(五)基本的网络请求

作者: Snorlax丶 | 来源:发表于2017-08-03 22:30 被阅读9370次

    链接:
    ionic3 教程(一)安装和配置
    ionic3 教程(二)登录页制作
    ionic3 教程(三)设置页制作
    ionic3 教程(四)安卓硬件返回键处理
    ionic3 教程(五)基本的网络请求

    这是最后一节,本节主要用最简单网络请求和基本的内置指令做一个演示。

    前言

    通常我们希望在 HTTP 请求的时候,页面不会失去响应,所以我们的 HTTP 请求是异步的。
    JavaScript 中,通常用 3 种方式处理异步代码。

    1. 回调(callback)
    2. 承诺(promise)
    3. 可观察对象(observable)

    promise 和 observable 主要三个主要不同:

    • observable 可以中途取消,promise 发出就不行
    • observable 可以持续发射很多值,而 promise 只能发射一个值就结束了
    • observable 提供了更多的工具函数,最常用的是 filter 等

    想更多了解 promise 的请看
    《JavaScript Promise迷你书》

    想更多了解 rxjs(observable) 的请看
    《rxjs中文教程》

    在 Angular 中,处理异步代码的最佳方式就是使用可观察对象,所以接下来会用到

    app.module.ts

    导入 Angular 的 HttpModule。

    import { HttpModule } from '@angular/http';
    
    //然后在 imports 中插入 HttpModule 即可
    

    测试用接口

    本来找了一些别的接口作为测试,发现不会显示数据,打开 Chrome 测试了一下发现有跨域问题。

    XMLHttpRequest cannot load
    

    所以这里给大家推荐个网站,我们就用他来进行测试。
    http://jsonplaceholder.typicode.com/

    拖到下面的 Resources 可以看到图片。从图中可以看出接口种类还是比较丰富的,我们选择带图片的 /photos 进行测试。

    Resources

    home.ts

    import { Http, Response } from '@angular/http';
    
    @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage {
      // 接收数据用
      listData: Object;
    
      // 依赖注入
      constructor(public navCtrl: NavController, private http: Http) {
    
      }
    
      ionViewDidLoad() {
        // 网络请求
        this.http.request('http://jsonplaceholder.typicode.com/photos')
        .subscribe((res: Response) => {
          this.listData = res.json();
        });
      }
    

    http.request 会返回一个 Observable 对象。我们可以使用 subscribe 订阅变化。

    当 http.request 从服务器返回一个流时,它就会发出一个 Response 对象。我们用 json 方法提取出响应体解析成一个 Object,最后将它赋值给 this.listData。

    home.html

    <ion-header>
      <ion-navbar>
        <ion-title>首页</ion-title>
      </ion-navbar>
    </ion-header>
    
    <ion-content padding>
      <ion-list *ngFor="let item of listData">
        <ion-item>
          <ion-avatar item-left>
            <img [src]="item?.url">
          </ion-avatar>
          {{item?.title}}
        </ion-item>
      </ion-list>
    </ion-content>
    

    这里使用了一个 ngFor 遍历了 listData,生成了一个列表数据。还有一点要提一下,这个 item?.title 是 Angular 的一种语法,如果对象为空就不会取值,可以防止报错。

    最后效果如图所示


    效果图

    再补上一个 Promise 的写法

    import 'rxjs/add/operator/toPromise';
    
    this.http.request('http://jsonplaceholder.typicode.com/photos')
      .toPromise()
      .then(res => { this.listData = res.json(); })
      .catch(err => { console.error(err) });
    

    自己动手试一试吧。这个入门系列结束之后,应该会去找一些模块进行深入点的展开。

    Demo下载地址

    相关文章

      网友评论

      • 我正年轻:您好,请教您一个问题,我按照上面的方法,请求我们同事写的后端接口,提示跨域问题,该如何解决呢
      • 罗强_d9ca:您好,请教您一个问题,首页的数据获取到了,没有显示,是什么原因?
      • 呦绅士:为什么我的HttpModule导入之后,HttpModule被禁用了,中间被一个横线划掉了?
        穿鞋的面条:@呦绅士 比较新的angular版本已经不再使用Http,而是改用HttpClient进行请求了
      • 5e58b144e14f:大神,问一下 ionic3怎么去接收后台传过来的对象?
      • 5e58b144e14f:请问一下,如果带参数跳转servlet后台,servlet怎么去接收? 这个参数传递好像时JSON格式传递的,有什么办法在传递的时候 把参数的KEY取出来然后传递?
        5e58b144e14f:@devilx 前台登陆页面的那些输入框怎么限制输入啊?就比如说 输入框能不能有小数。提示框不要用alert 。想要一个漂亮点的提示框 怎么弄?
        Snorlax丶:@桀骜难训 :scream: 不太懂后台
      • 29fa2fddc22e:使用this.http.request请求后台,怎么带参数请求呢?
        5e58b144e14f:@风之旅_1a4f 你是怎么接收到参数的?
        29fa2fddc22e:@devilx 谢谢楼主的回复,该问题已经解决了;我用的是servlet,post中的参数需要做转换,否则接收不到参数
        Snorlax丶:get:this.http.get(url) 把参数拼进 url,post:this.http.post(url, 参数)
      • XLOVEH:谢谢楼主 入门还是从简单例子入手比较好理解
      • 李有114:你好,楼主!
        请问:Failed to load http://jsonplaceholder.typicode.com/photos: Redirect from 'http://jsonplaceholder.typicode.com/photos' to 'https://jsonplaceholder.typicode.com/photos' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8100' is therefore not allowed access.

        这个问题如何解决?
      • 画圈圈的影子:非常 感谢 用了 1个小时 就大致了解 ionic3 是怎么个写的 但是还有些问题 比如说 ionic3的路由怎么传参数 怎么接 模块间通讯怎么做 希望以后在出此类似的文章
        29fa2fddc22e:@devilx 期待作者君的指导
        Snorlax丶:@f350ae4a588e :joy: 上班很忙,有时间一定来填坑
      • ceido:大神你好,我得到数据了,输出来没问题,但是就是不显示,是不是你说的跨域问题呢?
        Snorlax丶:@wanderer_dfb9 得到数据没显示应该是代码问题啦。跨域的话就拿不到数据了呢
      • AirPython:如要要和Native交互,有好的方式推荐吗?
        AirPython:@devilx 使用cordova加入自定义的插件的时候,会报错,我提了Issue,请问一下,是不是ionic3 版本不兼容导致的呢?
        https://github.com/ionic-team/ionic/issues/13136
        Snorlax丶:cordova :wink:
      • 2d6182223e59:.toPromise()报错为什么?import 'rxjs/add/operator/toPromise'也导入了。
      • 万象归真:楼主 如何解决跨域问题呢?
      • 421ad736768c:老大有没有一些好的教程推荐,中英文都可以!
        Snorlax丶:@Gabriel_wei http://ionicframework.com/docs/ 官方文档,大多问题可以在这里得到解决
      • 421ad736768c:学习了。老大,你要是不忙了,就在写一个下拉加载触发一次ajax请求。每次请求5个数据,应该就会这么卡了
      • 浅色流光:你好,这里的请求是get请求吧,请问post请求怎么发,能像文章里面一样,给断代码范例吗,Observable和promise,求帮助,文章写得很仔细,get的方法我已经会使用了:stuck_out_tongue_closed_eyes:
        浅色流光:@devilx 嗯,我试着传递了参数,http.post后第一个是url第二个是data,第三个应该怎么写呢?我没有写第三个参数,服务端可以接收到我传递的data,另外订阅方式和get是否一样呢?我就只把前面的request改成了post然后改了下参数:blush:
        Snorlax丶:https://angular.cn/tutorial/toh-pt6
        看看官方文档这个,网页内搜 post,有示例代码
        Snorlax丶:你输入 this.http. 有惊喜。get、post、put、delete 之类的都有。
      • 0c5f63711b65:我照着你的代码写的,但是运行时候报错说no provider for http,这个是怎么回事?
        0c5f63711b65: @devilx 但是还有一个问题,因为数据太多了,所以初次加载特别慢,我需要实现比如首次加载二十条,下拉刷新再加载二十条,这个该怎么做?
        0c5f63711b65: @devilx 谢谢,按你说的,导入了httpmodule可以了
        Snorlax丶:在 app.module.ts 的 provider 中加入 http
      • yaokuangyi:你好,楼主,我把你的demo下载下来在本地运行时报错,Error
        Close
        Runtime Error
        webpackJsonp is not defined
        Stack
        ReferenceError: webpackJsonp is not defined
        at http://localhost:8100/build/main.js:1:1 ,不知道咋回事,请楼主指教一下
      • Dreamhai:奇怪了,我发现安装到手机上后,非常的卡是怎么回事呢,下面的tab都切换困难,等好久要。。。请求的数据也是很慢显示出来,卡死了
        8128ab9a6706:@Dreamhai 这个卡应该是访问的国外的资源引起的卡,不是ionic引起的。
        Dreamhai:@devilx 额,这不是一般的卡呀,切换tab都是卡的不行额,网上不是说ionic在苹果机上的流畅度还不错的嘛
        Snorlax丶:@Dreamhai ionic 没原生流畅很正常。这个接口数据是国外的,肯定卡
      • badbcdcbc898:感谢,今天手贱ionic2 升级到了3,网上看了降级啥的 不想做。决定将错就错,希望能有一些2和3对比的说明
        Snorlax丶:@sangyenorbu 改变不太多,但是现在到 3.7.0 了经历了很多小版本了。你可以看一下我专题里收的一篇别人写的 升级到 ionic3。其他的改动还有自动生成界面不会产生 module 了。官方的 github 也有每个版本的改动,有空我去翻译一下:smirk:

      本文标题:ionic3 教程(五)基本的网络请求

      本文链接:https://www.haomeiwen.com/subject/sldmlxtx.html