【问题标题】:POST request causes GET call to not respondPOST 请求导致 GET 调用无响应
【发布时间】:2013-08-02 15:09:52
【问题描述】:

我有一个关于使用 POST 下载文件的问题。

我有以下 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. 如果此代码正常且没有其他方法可用。在整个页面加载完成并且所有其他请求都完成后,是否有强制此方法在最后一件事上运行?

【问题讨论】:

  • get 请求是否由于表单发布启动的页面重新加载而中止?通常,像这样的表单帖子具有指向特定 iframe 的 target 属性,导致 iframe 重新加载,而不是整个页面,这将允许您的 get 请求完成。
  • 我不明白您为什么不能使用 AJAX 进行下载。为什么在获取某些东西时使用 POST?
  • @putvande 因为使用 ajax,您无法将内容作为文件发送到用户的计算机。
  • @KevinB 但您可以在下载该文件的文件的回调中执行 window.location.href。
  • "在整个页面加载完成并且所有其他请求都完成后,是否有强制此方法在最后一件事上运行?" -- 是的,.ajaxComplete()

标签: javascript jquery html


【解决方案1】:
  1. 从GET请求中的描述不是很清楚是从同一个iframe发送的。是的,然后在提交表单后重新加载 iframe 内容 - 因为它不是 AJAX 请求 - 停止在 iframe 中运行的所有其他 javascript 代码。

  2. 好吧,您可以向表单添加 'target="_blank"' 属性 - 在这种情况下,iframe 内容不会在表单提交时重新加载。

  3. 是的,很有可能。 jQuery.ajax 方法返回 Deferred 对象。因此,您可以将这些延迟对象存储在数组变量中,然后等待所有延迟对象都已解决。然后才运行 POST 提交。 jquery.whenAll插件可以简化这个任务:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多