关于纯xmlhttprequest请求服务器数据
今天我们的web技术已经相当的完善, 各种前端框架如jquery或者再深一点的工具APIcloud 的使用极大的方便了我们的开发工作.
今天我要分享一个纯javascript的方式来解决请求服务器数据或者异步请求数据来交互的方式.
因为我们的项目前端是ThunderAPP开发的android和IOS移动客户端, 使用完全封闭的APIcloud, 请求的形式都是AJAX
api.ajax({
url : urlConstant.baseUrl + urlConstant.getUserMsgUrl + '?userId='
+ encodeURI(sellerId),
method : 'get',
timeout : 30,
dataType : 'json',
returnAll : false,
}, function(ret, err) {
if (ret) {
if (ret.status == 200) {
$api.byId('userAccount').innerHTML = ret.name;
console.log('@@##sellerAccount=' + ret.name);
} else {
if (ret.info == '获取用户信息失败') {
api.alert({
msg : '卖家的用户名获取失败!'
}, function(ret, err) {
if (ret.buttonIndex == 1) {
api.closeWin();
}
});
} else {
api.alert({
msg : ret.info
});
}
}
} else {
api.alert({
msg : err.msg
});
}
});
接下来我们看一下传统的jquery封闭的ajax:
$.ajax( {
url : eval(uri).ihv_list,
type : "post",
dataType : "html",
data : "page="+page+"&record="+record+"&"+params+"&orderType="+orderType+"&orderName="+orderName,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
success : function(data, textStatus, jqXHR) {
if(jqXHR.status == 0){
alert('Unable to get the data, please check whether the network flow.');
}else{
$('#Searchresult').html(data);
if(type == 1)initPagination($("#page_count").val());
}
},
error : function(data, textStatus){
//alert(textStatus);
if("session timeout." == data.responseText){
alert('session timeout.');
}else{
alert(data.responseText);
}
location.href = eval(uri).login_page;
}
});
以上两种封闭的代码只能和以下struts2的action交互:
public void getGoodsById() throws IOException {
String result = goodsService.getGoodsById(id);
ActionContext context = ActionContext.getContext();
HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE);
OutputStream out = response.getOutputStream();
out.write(result.getBytes("utf-8"));
out.flush();
out.close();
}
然后我再提供我们的方案, 我们方案的出现是因为现在需要增加后台来管理, 这样我们的局限性在于必须接受服务器返回这种形式的结果,
我放弃了JSP这种服务器动态编译生成的网页返回的形式, 只能通过AJAX请求来完成与服务器的交互.
那么我们无非需要请求数据并且将取得的数据解析并更新到网页上去.
我们只有两个步骤:
1. 创建一个XMLHttpRequest对象, 来为各个需要调用ajax请求的地方提供一个对象可以访问服务器接口.
function MyXMLHttpRequest() {
var xmlhttprequest;
if (window.XMLHttpRequest) {
xmlhttprequest = new XMLHttpRequest();
if (xmlhttprequest.overrideMimeType) {
xmlhttprequest.overrideMimeType("text/xml");
}
} else if (window.ActiveXObject) {
var activeName = [ "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ];
for (var i = 0; i < activeName.length; i++) {
try {
xmlhttprequest = new ActiveXObject(activeName[i]);
break;
} catch (e) {
}
}
}
if (xmlhttprequest == undefined || xmlhttprequest == null) {
alert("XMLHttpRequest对象创建失败!!");
} else {
this.xmlhttp = xmlhttprequest;
}
}
MyXMLHttpRequest.prototype = {
send : function(method, url, data, callback, failback) {
if (this.xmlhttp != undefined && this.xmlhttp != null) {
method = method.toUpperCase();
if (method != "GET" && method != "POST") {
alert("HTTP的请求方法必须为GET或POST!!!");
return;
}
if (url == null || url == undefined) {
alert("HTTP的请求地址必须设置!");
return;
}
var tempxmlhttp = this.xmlhttp;
this.xmlhttp.onreadystatechange = function() {
if (tempxmlhttp.readyState == 4) {
if (tempxmlhttp.status == 200) {
var responseText = tempxmlhttp.responseText;
var responseXML = tempxmlhttp.reponseXML;
if (callback == undefined || callback == null) {
alert("没有设置处理数据正确返回的方法");
alert("返回的数据:" + responseText);
} else {
callback(responseText, responseXML);
}
} else {
if (failback == undefined || failback == null) {
alert("没有设置处理数据返回失败的处理方法!");
alert("HTTP的响应码:" + tempxmlhttp.status
+ ",响应码的文本信息:" + tempxmlhttp.statusText);
} else {
failback(tempxmlhttp.status, tempxmlhttp.statusText);
}
}
}
}
//解决缓存的转换
/* if (url.indexOf("?") >= 0) {
url = url + "&t=" + (new Date()).valueOf();
} else {
url = url + "?+=" + (new Date()).valueOf();
}*/
//解决跨域的问题
/*if (url.indexOf("http://") >= 0) {
url.replace("?", "&");
url = "Proxy?url=" + url;
}*/
this.xmlhttp.open(method, url, true);
//如果是POST方式,需要设置请求头
if (method == "POST") {
this.xmlhttp.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
}
this.xmlhttp.send(data);
//this.xmlhttp.send(JSON.stringify(data));
} else {
alert("XMLHttpRequest对象创建失败,无法发送数据!");
}
},
abort : function() {
this.xmlhttp.abort();
},
test : function(){
alert("1234");
}
}
包含此对象文件
<script src="javascript/MyXMLHttpRequest.js" type="text/javascript"></script>
调用脚本处:
window.onload = function(){
var submit = document.getElementById('loginSubmit');
submit.onclick = function(){
var name = document.getElementById("loginName").value;
var pwd = document.getElementById("loginPwd").value;
var data = "name=" + name + "&pwd=" + pwd; //此处注意
var request = new MyXMLHttpRequest();
request.send("POST", "login.do",data ,success_callback, error_callback);
};
function success_callback(responseText,responseXML){
var obj = JSON.parse(responseText); //返回的数据
switch(obj.status){
case 200:
document.location.href = "index.jsp";
break;
default:
alert(obj.info);
break;
}
};
function error_callback(status, statusText){
alert(status + ", " + statusText);
};
};
关于form表单字段上传到服务器的部分及服务器返回的数据需要特别注意.
关于纯xmlhttprequest请求服务器数据的更多相关文章
- Ajax在jQuery中的应用(加载异步数据、请求服务器数据)
加载异步数据 jQuery中的load()方法 load(url,[data],[callback]) url:被加载的页面地址 [data]:可选项表示发送到服务器的数据,其格式为 key/valu ...
- app请求服务器数据方法1-HttpUrlConnection
1. 实例化URL对象 首先第一步实例化一个URL对象,传入参数为请求的数据的网址. URL url = new URL("http://www.imooc.com/api/teacher? ...
- APP请求服务器数据-HttpUrlConnection
1. 实例化URL对象 首先第一步实例化一个URL对象,传入参数为请求的数据的网址. URL url = new URL("http://www.imooc.com/api/teacher? ...
- iOS请求服务器数据去空NSNull
我们在处理数据库接口的过程中,如果数据中出现null,我们是没法处理的.我在使用NSUserDaults保存后,出现崩溃. null产生原因 null是后台在处理数据的时候,如果没有设置value值, ...
- java ajax长连接请求服务器数据
Servlet 3.0笔记之异步请求Comet推送长轮询(long polling)篇 Comet另一种形式为长轮询(long polling),客户端会与服务器建立一个持久的连接,直到服务器端有数据 ...
- 使用ajax()方法加载服务器数据
使用ajax()方法加载服务器数据 使用ajax()方法是最底层.功能最强大的请求服务器数据的方法,它不仅可以获取服务器返回的数据,还能向服务器发送请求并传递数值,它的调用格式如下: jQuery.a ...
- 本地主机作服务器解决AJAX跨域请求访问数据的方法
近几天学到ajax,想测试一下ajax样例,由于之前在阿里租用的服务器过期了,于是想着让本地主机既做服务器又做客户端,只是简单地测试,应该还行. 于是,下载了xampp,下载网址http://www. ...
- ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
写在前面 :从提出需求到完美的解决问题,实现过程是曲折的. 需求:在前(web client)后(Restful Service)端完全解耦的模式框架下,webclient需要请求 Service 返 ...
- Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)
1.POST请求: 数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦 2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...
随机推荐
- Oracle - SPM固定执行计划(一)
一.前言 生产中偶尔会碰到一些sql,有多种执行计划,其中部分情况是统计信息过旧造成的,重新收集下统计信息就行了.但是有些时候重新收集统计信息也解决不了问题,而开发又在嗷嗷叫,没时间让你去慢慢分析原因 ...
- C#串口类封装 SuperSerialPort
C#串口类封装 SuperSerialPort 基于SerialPort类做了简单的封装方便调用 代码 /// <summary> /// SuperSerialPort /// < ...
- springboot脚手架,逐渐成长成一个优秀的开源框架
目录 项目介绍 环境搭建 开发工具 开发环境 工具安装 系统架构 启动项目 springboot基于spring和mvc做了很多默认的封装.这样做的好处极大的方便了开发者的效率.尽管与此我们每个人还是 ...
- Eclipse导入spring-boot-plus(三)
Eclipse导入spring-boot-plus 安装lombok插件 !!!请先确保Eclipse已安装lombok插件!!!
- spring-boot-plus快速快发脚手架简介
Everyone can develop projects independently, quickly and efficiently! Introduction spring-boot-plus是 ...
- 后端开发实践系列之三——事件驱动架构(EDA)编码实践
在本系列的前两篇文章中,笔者分别讲到了后端项目的代码模板和DDD编码实践,在本文中,我将继续以编码实践的方式分享如何落地事件驱动架构. 单纯地讲事件驱动架构(Event Driven Architec ...
- Java - 集合之间的关系和区别
1.Java集合关系图: 2.List.Map.Set区别: ① List ArrayList LinkedList Vector Advantage Search Insert.Delete Syn ...
- SqlServer关于“无法删除数据库 "XXXX",因为该数据库当前正在使用”问题的解决方案
引言 在项目中,通过使用SQL语句“DROP DATABASE [数据库名]”删除数据时,一直出现“无法删除数据库 "XXXX",因为该数据库当前正在使用”的错误信息,经测试在Sq ...
- postman 接口参数化操作
最近一直忙于AI模型的准确率任务中,这种操作需要大量的数据才能计算出模型的准确率.所以这里问遇到的问题和之前数据随机参数化有点不同,之前的参数比如说用户姓名或用户身份证号,这样数据可以在postman ...
- P2154 [SDOI2009]虔诚的墓主人 树状数组
https://www.luogu.org/problemnew/show/P2154 题意 在一个坐标系中,有w(1e5)个点,这个图中空点的权值是正上,正下,正左,正右各取k个的排列组合情况.计算 ...