1. 程式人生 > >跨域請求京東介面

跨域請求京東介面

我們伺服器上專案連結:

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的值可以根據後臺傳的或者自定義的去寫,比如上邊寫的 

jsonpCallback:'jdcard'

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"); 
}

這個活無比煎熬,因客戶總改需要,再加之跨域請求,上到京東伺服器時,由於 兩個伺服器之間呼叫,也存在一些問題。

端午節三天假,我兩天都在加班抓狂