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版本 ...
随机推荐
- IP报文解析及基于IP 数据包的洪水攻击
版本(4bit) 报头长度(4bit) 优先级和服务类型(8bit) 总长度(16bit) 标识(16bit) 标志(3bit) 分段偏移(13bit) 存活期(8bit) 协议(8bit) 报头校验 ...
- 基于TF/IDF的聚类算法原理
一.TF/IDF描述单个term与特定document的相关性TF(Term Frequency): 表示一个term与某个document的相关性. 公式为这个term在document中出 ...
- oracle 学习笔记--用户管理
oracle 用户管理 创建用户(需要具有dba权限的用户) create user 用户名 identified by 密码 defaule tablespace users //默认表空间 ...
- MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装(转载)
转载地址http://elf8848.iteye.com/blog/630864 下载MyEclipse 8.5 可以通过代理http://www.proxyie.cn/访问MyEclipse的官方网 ...
- __ARM_PROFILE_M__ __CORE__ __ARMVFP__ __LITTLE_ENDIAN__
__ARM_PROFILE_M__ Description An integer that is set based on the --cpu option. The symbol is set to ...
- python flask model 序列化
class DictSerializable(object): def as_dict(self,*args): result = OrderedDict() ...
- centos 没有可用的网络设备
在重装的时候记得查看网络情况,提示没有可用的网络设备. 系统是64位的,我再创建虚拟机选择客户机操作系统的时候,选择成了 centos .不是centos 64位.改成centos 64位后,就显示了 ...
- 编写高效的Android代码
编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...
- iOS开发——高级UI—OC篇&退出键盘
退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中 ...
- 依赖注入框架Autofac的简单使用
http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html Autofac是一款IOC框架,比较于其他的IOC框架,如S ...