最近做React native开发,遇到了这种fetch请求,说实话,以前用ajax比较多,对这种fetch请求
还真是不怎么了解,所以花时间百度一下,看看大家怎么用的。顺便也需要封装一下网路请求的
get和post方法,方便下面的调用。
话不多说,直入主题:
开发中,从网络上加载数据一直是重点和难点,尤其是在做相应的细节优化方面,在React Native 中通常是用哪种
方式加载网络数据呢?
React Native 中通常是通过 Ajax 从服务器获取数据,在 componentDidMount
方法中创建 Ajex 请求,等到请求成功,
再用 this.setState
方法重新渲染UI
fetch 目前还不是 W3C 规范,是由 whatag 负责研发。与 Ajax 不同的是,它的 API 不是事件机制,而是采用目前
流行的 Promise(MDN Promise) 方式处理
格式:
init
是一个对象,他里面包含了: 译注:
- body:不可传对象,用JSON.stringify({…})也不可以,在jQuery 中会自动将对象封装成 formData 形式,fetch不会。
- mode属性控制师傅跨域,其中 same-origin(同源请求,跨域会报error)、no-cors(默认,可以请求其它域的资源,
- 不能访问response内的属性)和 cros(允许跨域,可以获取第三方数据,必要条件是访问的服务允许跨域访问)。
- 使用 fetch 需要注意浏览器版本,但 React-Native 则不需要考虑。
response
对象可以有如下几种解析方式
下面是一个最基本的请求,只传入一个参数,默认为 GET 方式请求
方式一:
方式二:
译注:
- application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。
- multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
- text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
- Fetch 跨域请求的时候默认是不带 cookie 的,如果需要进行设置 credentials:’include’。
produces="text/html;charset=UTF-8"
get(url, func=false) { return fetch(url) // GET方式 获取Json数据 .then((response) => { let data = response.json(); // 解析数据为 json格式 return data; // 传递数据给下一步 }) .then((json_data) => { // 接收刚刚获取到的数据 // 如果有回调 if( false!==func ){ func(json_data); } }) .catch ((error) => { // 从fetch开始,到最后一个then,有错误出现,则会捕捉错误。 console.warn('Catch info:'); console.error(error); }); },
post(url, ini_json={}, unlisted=false) { let token = '', // 身份识别码 headers = { // http请求头 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, body = '', // 用于post的数据 func = undefined !== ini_json.func? ini_json.func : false; // 回调函数 // 请求时,请求地址带上token if( false=== unlisted ){ token = unlisted;// 这里是token } if( undefined !== ini_json.headers ){ headers = init_json.headers; } // 暂不支持数组传输,已建议同类数据以逗号分隔 if( undefined !== ini_json.data ){ // 如果有数据 for(let i in ini_json.data){ body += i + '=' + encodeURIComponent(ini_json.data[i]) + '&'; } } return fetch(url, { method: 'POST', headers: headers, body: body, }) .then((response) => { let data = response.json(); // 解析数据为 json格式 return data; // 传递数据给下一步 }) .then((json_data) => { // 接收刚刚获取到的数据 // 如果有回调 if( false!==func ){ func(json_data); } }) .catch ((error) => { // 从fetch开始,到最后一个then,有错误出现,则会捕捉错误。 console.warn('Catch info:'); console.error(error); }); } }