React Native教程 - 调用Web API
react-native官网Fetch介绍:https://facebook.github.io/react-native/docs/network.html#content
react-native中不支持$,也就是说我们无法使用$HTTP来调用API,根据react-native官网教程,我们可以使用fetch,这也是一个更好的网络API,它在react native中默认可以使用。
在react-native项目中,我们还是使用我们的惯用方法,写一个服务js来放我们的所有API,但是在react-native中,我们将会有一些定义上和使用方法上的变化。
了解fetch
fetch(input, init)
第一个参数input可以是一个字符串,包含获取资源的URL;
第二个参数对象是可选的,它可以自定义HTTP请求中的一些部分;
method: 请求使用的方法,如 GET、POST。
headers: 请求的头信息,形式为 Headers 对象或 ByteString。
body: 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
mode: 请求的模式,如 cors、no-cors 或者same-origin。
credentials: 请求的 credentials,如 omit、same-origin 或者include。
cache: 请求的 cache 模式: default, no-store, reload, no-cache, force-cache, or only-if-cached.
fectch()的返回值是一个Promise对象,它可以使用then和catch指定回调函数:
fetch(input, init)
.then((response) => response.json())
.then((responseJson) => {console.log(responseText);})
.catch((error) => {console.warn(error);});
fetch返回函数callback()的参数定义:fetch返回函数参数定义
- 如果接口调用成功,我们返回callback(null,data);有两个参数:
第一个参数传null,代表接口调用成功;
第二个参数data为接口返回的数据; - 如果接口未调用成功,我们返回callback(err);只有一个参数:err为错误消息;
fetch示例
使用该方法时,不需要引入fetch,直接拿来用就可以了。
先来简述一下《意见反馈》demo都有哪些服务API功能:
- 根据app的GUID获得该app的信息(GET方法);
- 用户发送所填写的内容(POST方法)
app的界面实现过程就不呈现了,主要说明的是如何调用web API的。
首先来建一个服务:app-feedback-svc.js。代码如下:
var baseURL = "http://192.168.89.101:8082/api/",
export default{
//获得某一app详细信息(不包含评论)
getOneAppInfoDetail(appGUID, callback){
fetch(baseURL + 'api/app/app-info/' + appGUID, {
method: 'GET'
}).then((response) => response.json())
.then((responseJson) => {
switch (responseJson.State) {
case 0:
var listOption = responseJson.Result.ListOption;
var result = {
tags: listOption.filter((item)=>item.OptionClass === 0).map((item)=>item.OptionString),
expect: listOption.filter((item)=>item.OptionClass === 1).map((item)=>item.OptionString)
};
callback(null, result);
break;
case 1:
callback('参数无效');
break;
case 2:
callback('未知错误(异常)');
break;
default:
callback('其他错误');
break;
}
})
.catch((error) => {
callback(error);
});
},
//保存app评价
saveAppComment(AppGUID, IsLike, CommentDetail, WishFeature, PhoneType, Email, callback){
var wishItem = {};
WishFeature.filter((item)=>item.check == true).map((item, index)=>(
wishItem['Item' + index] = item.label
));
fetch(baseURL + 'api/comment/save-comment', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
AppGUID: AppGUID,
IsLike: IsLike,
CommentDetail: CommentDetail,
WishFeature: wishItem,
PhoneType: PhoneType,
Email: Email
})
}).then((response) => response.json())
.then((responseJson) => {
switch (responseJson.State) {
case 0:
callback(null);
break;
case 1:
callback('参数无效');
break;
case 2:
callback('未知错误(异常)');
break;
default:
callback('其他错误');
break;
}
})
.catch((error) => {
callback(error);
});
}
}
服务js承担中转作用,因此我们需要处理接口返回的数据的格式时,尽量在服务js中转换完成之后,再在页面中使用。
例如上述文件中, 获得app信息函数getOneAppInfoDetail(),接口返回的数据有所有的app信息,但是我们页面上不需要那么多信息,因此,我们需要在服务中,当接口调用成功并有数据返回后,我们要重新构造我们需要的数据格式:
//responseJson.State==0
var listOption = responseJson.Result.ListOption;
var result = {
tags: listOption.filter((item)=>item.OptionClass === 0).map((item)=>item.OptionString),
expect: listOption.filter((item)=>item.OptionClass === 1).map((item)=>item.OptionString)
};
callback(null, result); //这样返回的数据result就只含有我们所需要的数据了。
页面调用API时,根据定义的服务函数里的参数来进行传参来得到app的信息或者保存用户的反馈。
获得app信息:
使用的是fetch的GET方法,我们只需要一个参数(appGUID)即可得到app的信息。
根据服务中的返回函数callback()的数据,我们通过判断第一个参数是否为空来判断我们的接口是否调用成功,是否获得到我们的想要的数据。
import feedbackSvc from './services/app-feedback.js';
componentDidMount() {
feedbackSvc.getOneAppInfoDetail(this.appGUID, function (info, data) {
if (info == null) {
var appDetailInfo = data;
var list = appDetailInfo.expect.map((item)=>({check: false, label: item}));
list.push({check: false, label: "其它功能"});
this.setState({appDetailInfo, list});
} else {
alert(info);
}
}.bind(this));
}
保存反馈内容:
使用的是fetch的POST方法,我们需要把反馈的每一个内容都作为参数传给接口,并且这些参数的格式要同接口需要的参数一致才可以成功保存内容,当然像GET方法,接口返回的数据格式不一定是我们想要的,同样地,我们前台页面获得的数据格式不一定是接口所需要的格式,我们转换数据格式的代码也应该放在服务js中处理。如app-feedback-svc.js中的saveAppComment(),我们页面中传过来的WishFeature是一个数组,但是接口需要的是一个对象,所以我们需要进行格式处理:
var wishItem = {};
WishFeature.filter((item)=>item.check == true).map((item, index)=>(
wishItem['Item' + index] = item.label
));
//这样我们得到的wishItem对象就是接口所需要的数据
页面中,当用户点击“发送”按钮后,用户所填写的数据才传到接口保存下来,所以我们需要定义一个函数_saveComment(),当用户点击时调用该函数,将所有内容都作为参数传给接口,如果调用接口成功,用户填写的数据将保存在我们的管理后台了。
import feedbackSvc from './services/app-feedback.js';
_saveComment() {
feedbackSvc.saveAppComment(this.appGUID, this.state.isLike, this.state.appOption, this.state.list, phoneType, this.state.email, function (info, data) {
if (info == null) {
alert('感谢您的反馈!');
} else {
alert(info);
}
}.bind(this))
}
React Native教程 - 调用Web API的更多相关文章
- 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)
原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...
- 【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)
原文:[ASP.NET Web API教程]3.3 通过WPF应用程序调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...
- 开发程序过程中遇到的调用Web Api小问题
在用Umbraco Web Api开发程序时,前端使用React调用Web Api 当时是有一个页面Search.cshtml,把用React产生的脚本代码,在这个页面进行引用 写了一个Api, 调用 ...
- React Native 教程:001 - 如何运行官方控件示例 App
原文发表于我的技术博客 本文主要讲解了如何运行 React Native 官方控件示例 App,包含了一些 React Native 的基础知识以及相关环境的配置. 原文发表于我的技术博客 React ...
- 通过.NET客户端调用Web API(C#)
3.2 Calling a Web API From a .NET Client (C#) 3.2 通过.NET客户端调用Web API(C#) 本文引自:http://www.asp.net/web ...
- WebApi系列~通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- ASP.NET MVC4中调用WEB API的四个方法
http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各 ...
- 通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口
1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...
随机推荐
- Jmeter_初步认识随笔
1. 简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试客户端/服务器结构的软件(例如web应用程序).它可以用来测试包括基于静态和动态资源程序的性能,例如静态文件,Ja ...
- 项目视频讲解_[HeyJava][尚学堂][CMS文章内容管理系统]
[HeyJava][尚学堂][CMS文章内容管理系统] http://pan.baidu.com/s/1c0imHrE
- <!DOCTYPE> 标签的深度剖析以及使用选择
前言: 今天被问道“有没有仔细了解过<!DOCTYPE>标签?”,愣了一下,因为一开始在W3cschool上看到过建议使用XHTML Transitional DTD,之后就很听话地把Dr ...
- Tomcat修改网址旁边的小图标
用Tomcat发布时候,往往不希望用IP地址旁边的Tomcat小猫,根据需求利用自己的icon图标. 先将需要的图片转换成icon格式的. 这个网站可以进行icon格式的转换:http://www.c ...
- perl学习笔记(2)
1)记得刚开始写perl的时候,对于一个功能,总是拿目前能用的数据类型来解决问题,不想想有没有更好的,能用能解决问题就好,这就导致了后期,要在函数里面添加功能的时候,函数要添加很多参数,一个函数有7. ...
- 让AllocateHwnd接受一般函数地址作参数
http://www.xuebuyuan.com/1889769.html Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: function Al ...
- Linux 卸载Oracle 11G
卸载oracle11G数据 1.使用SQL*PLUS停止数据库[oracle@OracleTest oracle]$ sqlplus /nologSQL> connect / as sysdba ...
- JQuery动画插件Velocity.js发布:更快的动画切换速度
5月3日,Julian在其GitHub上发布了Velocity.js.Velocity.js是一款动画切换的jQuery插件,它重新实现了jQuery的$.animate()方法从而加快动画切换的速度 ...
- This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
但web启用了md5加密后 有可能出现这样的错误 This implementation is not part of the Windows Platform FIPS validated cryp ...
- 財哥面京东dm的经历【帮財哥发的】
关于面京东,感触仅仅有一个,虐的快吐血了.首先说京东分四个板块,有京东商城.京东金融.京东刚收购的拍拍和海外事业部.我这个职位主要是在金融部数据组做数据挖掘和机器学习,还有推荐系统.面试是在周 ...