2013-03-31 121 views
0

我使用crossrider來實現跨瀏覽器插件。使用Crossrider連續json&jsonp請求失敗?

我有兩個連續的AJAX請求(JSON和JSONP):

  1. 首先是 「登錄」,這會設置一個cookie的瀏覽器 JSON請求。
  2. 第二個是「保存」的JSONP請求,它使用cookie將一些數據保存到服務器。


下面的代碼的一個簡單的例子:

$.ajax({ 
    url : "https://app.testafy.com/api/v0/user/login", 
    type : 'GET', 
    cache : false, 
    dataType : 'json', 
    data : {login_name: "abashir", password: "[email protected]"} 
}).done(function(response) { 
    alert("Login Success"); 
    $.ajax({ 
     url : 'https://app.testafy.com/api/v0/test/save', 
     type : 'GET', 
     cache : false, 
     dataType : 'jsonp', 
     data : {"pbehave":"For+the+url+http%3A%2F%2Fstackoverflow.com%2F%0D%0A","title":"test","description":" "} 
    }).done(function(response) { 
     alert("Saving Success:\n\n" + JSON.stringify(response, undefined)); 
    }).fail(function(jqXHR, textStatus, errorThrown) { 
     alert("Saving Failure:\n\n" 
      + JSON.stringify(jqXHR, undefined) + "\n\n" 
      + JSON.stringify(textStatus, undefined) + "\n\n" 
      + JSON.stringify(errorThrown, undefined)); 
}); 
}).fail(function(jqXHR, textStatus, errorThrown) { 
    alert("Login Failure:\n\n" 
     + JSON.stringify(jqXHR, undefined) + "\n\n" 
     + JSON.stringify(textStatus, undefined) + "\n\n" 
     + JSON.stringify(errorThrown, undefined)); 
}); 

它非常適用於IE,FF &瀏覽器,如果它在一個HTML(自動登錄再自動保存)。

但是,當放置在crossrider extension.json(在appAPI.ready中)時,它會在每個瀏覽器中提供三種不同的行爲。

使用Chrome:

  • 登錄成功終止。
  • 保存失敗,並輸出:

{ 「readyState的」:4 「狀態」:200, 「狀態文本」: 「成功」}
「parseerror」
{}


對於Firefox:

  • 登錄成功終止。
  • 一個彈出輸入憑據(abashir & 2P @ ssw0rd)
  • 保存失敗後輸出要求憑據(好像餅乾沒有被登錄設置!!)
  • { 「readyState的」:4 「狀態」:200, 「狀態文本」: 「成功」}
    「parseerror」
    {}


  • 對於IE9:

    • 登錄失敗,輸出:

    { 「readyState的」:0 「setRequestHeader」:{},....「狀態文本」:「沒有交通」}
    「錯誤」
    「否傳輸」


    PS,使用招,我注意到,在鉻的響應返回從服務器是正確的(儘管阿賈克斯失敗功能叫),在這裏從Fiddler的請求/響應對:


    REQUEST:

    GET https://app.testafy.com/api/v0/test/save?callback=jQuery17107044411341194063_1364461851960&pbehave=For%2Bthe%2Burl%2Bhttp%253A%252F%252Fstackoverflow.com%252F%250D%250A&title=test&description=+&_=1364461865618 HTTP/1.1 
    Host: app.testafy.com 
    Connection: keep-alive 
    Accept: */* 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 
    Referer: http://stackoverflow.com/ 
    Accept-Encoding: gzip,deflate,sdch 
    Accept-Language: en-US,en;q=0.8 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
    Cookie: __utma=124963983.2014233417.1360749029.1362583015.1362996135.12; __utmc=124963983; __utmz=124963983.1362322761.9.3.utmcsr=stackoverflow.com|utmccn=(referral)|utmcmd=referral|utmcct=/; GSG_SESSIONID=ee03a02cdb6f3c0e3d812795be63c788 
    


    迴應:

    HTTP/1.1 200 nginx 
    Access-Control-Allow-Origin: * 
    Content-Type: application/json; charset=utf-8 
    Date: Thu, 28 Mar 2013 09:03:48 GMT 
    P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL" 
    Set-Cookie: GSG_SESSIONID=ee03a02cdb6f3c0e3d812795be63c788; domain=app.testafy.com; path=/; secure; HttpOnly 
    Content-Length: 273 
    Connection: keep-alive 
    
    jQuery17107044411341194063_1364461851960({"test_id":"558","message":"Phrase check has found the following error(s), but your test was still saved:\nThere's no For rule for '+the+url+http%3A%2F%2Fstackoverflow.com%2F%0D%0A'\n\nSaved new test as id#558","project_id":"151"}); 
    

    你可能注意到了,所產生的回調函數的調用包含正確的JSON對象,儘管失敗函數被調用回來了!並且無法訪問此響應以從中提取數據!

    如何使用crossrider在前3個瀏覽器(IE,FF,Chrome)上連續執行2個請求?

    回答

    3

    我懷疑這個問題與在擴展範圍內使用$ .ajax時遇到的跨域限制有關。

    通過使用我們的appAPI.request.post方法,您可以通過下面的示例代碼避免此問題。該代碼已在Chrome中進行測試,並且登錄和保存都成功。

    讓我知道你是否需要任何進一步的幫助。

    appAPI.ready(function ($) { 
        appAPI.request.post({ 
         url : "https://app.testafy.com/api/v0/user/login", 
         onSuccess: function (response) { 
          alert("Login Success"); 
          appAPI.request.post({ 
           url : 'https://app.testafy.com/api/v0/test/save', 
           onSuccess: function (response) { 
            alert("Saving Success:\n\n" + appAPI.JSON.stringify(response)); 
           }, 
           onFailure: function (httpCode) { 
            alert("Saving Failure:\n\n" + httpCode); 
           }, 
           postData : { 
            "pbehave" : "For+the+url+http%3A%2F%2Fstackoverflow.com%2F%0D%0A", 
            "title" : "test", 
            "description" : " " 
           } 
          }); 
         }, 
         onFailure: function (httpCode) { 
          alert("Login Failure:\n\n" + httpCode); 
         }, 
         postData: { 
          login_name : "abashir", 
          password : "[email protected]" 
         } 
        }); 
    });