热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从零学ReactNative之14网络请求

通过HTTP或者HTTPS协议与网络侧服务器交换数据是移动应用中常见的通信方式。node-fetch是RN推荐的请求方式。ReactNative框架在初始化项目时,引入了node-

react

通过HTTP或者HTTPS协议与网络侧服务器交换数据是移动应用中常见的通信方式。 node-fetch是RN推荐的请求方式。

React Native框架在初始化项目时, 引入了node-fetch包 (因为npm3把依赖全部摊平了,node-fetch就在node_modules目录下)

下面就是项目中引入的node-fetch的源码:

联网分为发送请求和接受响应两步。分开来分析下。

发送请求

发送http/https gong细分一下共有6个步骤

1. 确定并准备请求地址与协议

2. 确定请求中的HTTP方法

3. 准备请求中药传输的消息头

4. 准备身份验证信息

5. 确定是否需要携带消息体/参数

6. 发出消息

我们以查询号码归属地这个地址演示下。

1. 确定并准备请求地址与协议

请求地址以http/https 开头,为了便于修改地址,通常将地址放在一个变量中。IOS9以上默认无法访问http请求, 具体参考后面的注意事项。

let url=`http://apis.baidu.com/showapi_open_bus/mobile/find`;

2. 确定请求中的HTTP方法

根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式:

+ PUT :增

+ DELETE :删

+ POST:改

+ GET:查

最常用的是GET和POST(实际上GET和POST都能办到增删改查)

如果不指定,默认的方法为GET,当前使用的api接口只支持get请求

let map={

method:'GET'

};

3. 准备请求中药传输的消息头

接下来需要设置请求中需要传输的消息头。消息头分为两种,其中一种是协议规定的标准消息头;另一种是用户自定义的消息头。

let privateHeaders={

'Private-Header':'values1', //自定义消息头

//'Content-Type':"text/plain", //设置消息体格式,GET请求不需要设置

//'User-Agent':'testAgent',// 如果不设置默认为okhttp/2.5.0

'apikey':'9dc7ab2f8993b0b215ad8c550e1f4ebe' //百度账号的apikey

};

map.headers=privateHeaders; //加上自定义消息头

map.follow=20;//设置允许最大的重定向次数,0不允许重定向

map.timeout=0;//设置超时时间,0代表没有

map.size=0;//请求回应中消息体最大允许的长度,0没有限制

RN支持gzip/deflate格式编码,不需要对此进行设置。RN收到gzip/deflate格式编码会自动转换为普通格式交给开发者。

消息头是不区分大小写的,如果有大写字母,传输的时候回自动转换为小写。

key信息请自己注册。

4. 准备身份验证信息

某些Http请求需要加入身份验证信息,比如上面的apikey,有些时候在需要进行身份验证的时候需要两次HTTP请求来完成。

5. 确定是否需要携带消息体/参数

如果需要带消息体,可以通过body配置,GET请求不需要。

map.body=JSON.stringify({

fistParam:'yourValue',

secondParam:'yourValue'

});

POST请求参数是放在消息体中,而GET直接拼装在请求地址后面通过?间隔。

let url=`http://apis.baidu.com/showapi_open_bus/mobile/find`;

let params='num=13126939916';

let requestURL=url+"?"+params;

6. 发出消息

将上述5步联合起来就可以得到发送HTTP或HTTPS的请求片段。如下:

componentDidMount() {

let url=`http://apis.baidu.com/showapi_open_bus/mobile/find`;

let params='num=13126939916';

let requestURL=url+"?"+params;

let map={

method:'GET'

};

let privateHeaders={

// 'Private-Header':'values1', //自定义消息头

// 'Content-Type':"text/plain", //设置消息体格式,GET请求不需要设置

// 'User-Agent':'testAgent',// 如果不设置默认为okhttp/2.5.0

'apikey':'9dc7ab2f8993b0b215ad8c550e1f4ebe'

};

map.headers=privateHeaders; //加上自定义消息头

map.follow=20;//设置允许最大的重定向次数,0不允许重定向

map.timeout=0;//设置超时时间,0代表没有

map.size=0;//请求回应中消息体最大允许的长度,0没有限制

//map.body='this is body';

fetch(requestURL,map)

.then(

(result)=>{

//接受回应消息处理.

console.log(result);

}

)

}

注意事项 解决IOS9以上默认不能访问http请求

WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推进网络通讯安全的一个重要方式。在 iOS 9 和 OS X 10.11 中,默认情况下非 HTTPS 的网络访问是被禁止的。当然,因为这样的推进影响面非常广,作为缓冲,我们可以在 Info.plist 中添加 NSAppTransportSecurity 字典并且将NSAllowsArbitraryLoads 设置为 YES 来禁用 ATS。

找到info.plist文件添加NSAllowsArbitraryLoads

或者直接在xcode中打开ios项目进行配置。

接收响应

当请求成功,会返回一个存储有回应数据的对象

  1. type 字符串类型,记录请求类型
  2. url 请求地址
  3. status 响应码 200代表成功
  4. ok 布尔类型,记录是否成功。

fetch方法

fetch 返回的 then 方法有一个 response 参数,它是一个 Response 实例。 Response 有如下方法:

  • clone() - 复制一份response
  • error() - 返回一个与网络相关的错误
  • redirect() - 返回了一个可以重定向至某URL的response.
  • arrayBuffer() - 返回一个带有ArrayBuffer的Promise.
  • blob() - 返回一个带有Blob的Promise.
  • formData() - 返回一个带有FormData的Promise.
  • json() - 返回一个带有JSON格式对象的Promise.
  • text() - 返回一个带有文本的Promise.

下面就是完整的返回json的例子:

fetch(requestURL,map)

.then((result)=>result.json()) // 返回带有json格式的Promise

.catch((error)=>{ // 捕获错误

console.log(error);

})

.then((responseData)=>{ // 输出json数据

console.log(responseData);

});

完整的例子

componentDidMount() {

let url=`http://apis.baidu.com/showapi_open_bus/mobile/find`;

let params='num=13126939916';

let requestURL=url+"?"+params;

let map={

method:'GET'

};

let privateHeaders={

'apikey':'9dc7ab2f8993b0b215ad8c550e1f4ebe'

};

map.headers=privateHeaders; //加上自定义消息头

map.follow=20;//设置允许最大的重定向次数,0不允许重定向

map.timeout=0;//设置超时时间,0代表没有

map.size=0;//请求回应中消息体最大允许的长度,0没有限制

fetch(requestURL,map)

.then((result)=>result.json()) //.json()

.catch((error)=>{

console.log(error);

})

.then((responseData)=>{

console.log(responseData);

});

}

当然也可以用ES2017的语法:

async netWork() {

let url=`http://apis.baidu.com/showapi_open_bus/mobile/find`;

let params='num=13126939916';

let requestURL=url+"?"+params;

try {

let respOnse= await fetch(requestURL,{

headers:{

'apikey':'9dc7ab2f8993b0b215ad8c550e1f4ebe'

}

});

let respOnseJson= await response.json();

console.log(responseJson);

return responseJson;

} catch (error) {

console.error(error);

}

}

更多精彩请关注微信公众账号likeDev


推荐阅读
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • RN即ReactNative基于React框架针对移动端的跨平台框架,在学习RN前建议最好熟悉下html,css,js,当然如果比较急,那就直接上手吧,毕竟用学习前面基础的时间,R ... [详细]
  • 1.webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用(1) ... [详细]
  • React提供三种方式创建Refs:字符串Refs(将被废弃)回调函数RefsReact.createRef(从React16.3开始)第一种方式不推荐使用,原因在此,并且可能会在之后的版本移除。classMyComponentextendsReact.Component{constructor(props){sup ... [详细]
author-avatar
蘑菇宝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有