跨域請求京東介面
我們伺服器上專案連結:
http://sk2shop.moxz.cn/
http://sk2shop.moxz.cn/index1.html
京東伺服器連結:
http://wqs.jd.com/promote/third/sk2shop2
http://wqs.jd.com/promote/third/sk2shop2/index1.html
京東提供的介面如下:
http://wq.jd.com/activeapi/opensendcouponapi?biz=bizname&cert=xxxxxx&returl=xxxxxx
前端需要在請求的介面返回的連結中,獲取ret狀態值(根據不同的狀態值,提示不同的資訊),及定義returl返回頁面;
遇到問題
1.跨域請求,jsonp問題;
$.ajax({
url:'src',
type:'get',
async : false,
dataType:'jsonp',
jsonpCallback:'jdcard',
success:jdcard
});
function jdcard(data){
var url;
if(data.code == 200){
url = data.url;
$.cookie("clicc","y");
location.href =url;
}
}
標紅的三項需特別注意:
a.asnyc:true(預設) 非同步方式,當ajax傳送請求後,兩個執行緒同時執行。
async:false; 同步執行。
b.當dataType:'jsonp',的情況下cache預設為false,jquery1.2以上新功能。
cache的作用就是第一次請求完畢之後,如果再次去請求,可以直接從快取裡面讀取而不是再到伺服器端讀取。
c.jsonpCallback:'jsonCallback'(預設情況下這麼寫),jsonpCallback是實現跨域請求時定義回撥函式用的。如果不涉及到跨域請求可以不寫。
jsonpCallback的值可以根據後臺傳的或者自定義的去寫,比如上邊寫的
d.success方法是所有的請求都請求完畢後執行的。
2.請求完成後再次重新整理頁面時,還是彈窗怎麼辦?
//此時頁面返回連結為:http://sk2shop.moxz.cn/?ret=0&retmsg=oijewiofj
擷取url,並獲取某個引數的方法(我們這技術大牛寫的,膩害):
var str = location.search, ret;
str=str.replace(/^\?/,'').split('&');
for (var i = str.length - 1; i >= 0; i--) {
if(str[i].match(/^ret/g)){
ret = str[0].split('=');
ret = ret[1];
break;
}
}
location.search是擷取link連結後的拼接引數,如本連結為:http://sk2shop.moxz.cn/?ret=0&retmsg=oijewiofj
那麼location.search後獲取的值為:?ret=0&retmsg=oijewiofj
然後利用正則進行匹配。最後得到ret值。
if(location.href.indexOf("?") != -1){
$(".loading").hide();
if(ret == 0){
$(".coupon").html("領取成功(領取成功,請到京東賬戶內檢視)");
}
}
因為當前ret值已經存在,所以重新整理頁面時會再執行一次彈窗方法,即使封裝在function裡也同樣會執行。
然。。研究半天,最後想出來了第一次請求時給個cookie值,每開啟頁面時判斷cookie值是否存在。
想法有了,但實現也並非那麼容易。
接下來是苦b的探索過程。
最後找到個好方法,判斷頁面是否第一次開啟,然後將cookie儲存起來:
var urlf=window.location.href;//獲取當前的URL
urlf=urlf.replace(/[^a-z0-9]/gi,"");//用正則清除字串中的所有非字母和數字的內容
if($.cookie(urlf)=="" || $.cookie(urlf)==null){
alert("第一次找開");
$.cookie(urlf,"y");
}else{
alert("已經開啟過");
$.cookie(urlf,"n");
}
這個活無比煎熬,因客戶總改需要,再加之跨域請求,上到京東伺服器時,由於 兩個伺服器之間呼叫,也存在一些問題。
端午節三天假,我兩天都在加班。