2013-08-02 37 views
0

我有一個問題涉及使用POST下載文件。POST請求導致GET調用不響應

我有以下的javascript它發送POST請求到服務器端下載文件:

function postCall(url, params) { 
    function doPostCall() { 
    var newForm = jQuery('<form>', { 
     'method':'POST', 
     'action': url 
    }); 

    for(key in params) { 
     if (params.hasOwnProperty(key)) { 
      newForm.append(jQuery('<input>', { 
       'name': key, 
       'value': params[key], 
       'type': 'hidden' 
      })); 
     } 
    } 
    newForm.appendTo("body").submit(); 
} 

這種方法是從HTML頁面中的iframe的無形叫。此頁面還有另一個正常的GET請求來獲取靜態HTML。但是,每次調用上述方法時,獲取靜態頁面的調用都不會從服務器端返回。

我知道用這麼少的信息有點難以理解,但代碼很龐大,很難放在這裏。我的問題是:

  1. 是否有與使用一種無​​形的形式發送POST請求獲取文件上面的代碼中任何明顯的問題?
  2. 有沒有其他更好的方法發送POST請求到服務器來下載文件。 (人們告訴Ajax調用不能用於下載文件)?
  3. 如果這段代碼沒問題,並且沒有其他方法可用。有沒有辦法強制這個方法在整個頁面加載完成並且所有其他請求都完成後最後一次運行?
+0

是否GET請求得到應有中止通過表單提交發起的頁面重載?通常這樣的表單帖子具有指向特定iframe的目標屬性,導致iframe重新加載,但不是整個頁面,這將允許您的獲取請求完成。 –

+0

我不明白你爲什麼不能使用AJAX做下載。爲什麼在你獲得某些東西時使用POST? – putvande

+0

@putvande因爲使用ajax,你不能將內容作爲文件發送給用戶的計算機。 –

回答

0
  1. 這不是在GET請求的描述很清楚從同一iframe或不發送。是的,然後在提交表單後,iframe內容重新加載 - 因爲它不是AJAX請求 - 停止在iframe中運行的所有其他JavaScript代碼。那麼,你可以在表單中添加'target =「_ blank」'屬性 - 在這種情況下,iframe內容不會在表單提交時重新加載。

  2. 是的,這是很有可能的。 jQuery.ajax方法返回Deferred對象。因此,您可以將這些延遲對象存儲在數組變量中,並等待直到所有延遲都已解析。然後只運行POST提交。 jquery.whenAll插件可以簡化這個任務:

    jQuery.whenAll(
        $.get(URL1), 
        $.get(URL2) 
    ) 
    .always(function(results) { postCall(url, params) });