如何在 Javascript 中获取给定 url 的内容类型?

Posted

技术标签:

【中文标题】如何在 Javascript 中获取给定 url 的内容类型?【英文标题】:How to get content type of a given url inside Javascript? 【发布时间】:2013-03-19 03:05:24 【问题描述】:

我想知道用户在我的 javascript 代码中输入的给定 url 的内容类型。实际上,我有一个下拉列表(html、csv、xls 等),我想这样做,所以当用户输入一个 url 时,我想检测 url 内容的类型并基于这种类型我想要设置我的下拉列表的值(html、csv、xls 等)。我知道,我可以像这样使用 Ruby 获取内容类型:

require 'open-uri'
str = open('http://example.com')
str.content_type #=> "text/html"

或者,我也可以使用 curl 获取内容,然后解析它以了解内容类型。但是,由于上面解释了我的需要,我需要在我的 Javascript 代码中执行此操作。有什么想法吗?

EDIT_1:

我在我的 javascript 中尝试了这段代码:

    $("#wiki_form_url").change(function()
        $.ajax(
            type: "GET",
            url: "content.rb",
            data: 
//                input_url: $("#wiki_form_url").val()
            ,
            dataType: "html"
        ).done(function (data) 
                    // `data` contains the content-type
                    alert('Success !!!');
                ).fail(function () 
                    alert("failed AJAX call");
                );
    );

我有一个 ruby​​ 脚本 content.rb 我在里面做:

require 'open-uri'

str = open('http://www.ofdp.org/benchmark_indices/25')
str.content_type

但是,它似乎不起作用。我遇到了 Ajax 失败。可能是因为脚本 content.rb 的 url 路径?我应该如何在这里指定脚本路径? (相对或绝对)

【问题讨论】:

那个 JavaScript 在什么环境下运行?节点? WSH?浏览器扩展?浏览器中的网页? 您是否已经选择了用于发出 HTTP 请求的库或 API?如果有,是哪个? 我认为您必须向服务器发出 AJAX 请求,然后使用上面的代码,响应 AJAX,并适当地做事。您将无法使用 Javascript 发出跨域请求并获取其内容类型 不,我没有特别选择任何东西。我正在开发 Rails 3.2 项目并使用一点 JavaScript。我不是 Javascript 方面的专家。 我想我的意思是你不能直接从 Javascript 中做到这一点。因此,从您的 Javascript 中,您必须对服务器上的 Ruby 方法进行 AJAX 调用。我从未使用过 RoR,所以我不知道如何将 URL 映射到方法。无论如何,您应该向该 URL 发出 AJAX 请求,运行上面的 Ruby 代码,然后返回 str.content_type 作为 AJAX 响应。然后,在您的 Javascript 中,您将获得 AJAX 响应并根据结果操作下拉列表。你没有使用 jQuery,是吗?它会使 AJAX 调用更容易一些,否则代码示例会更长一些 【参考方案1】:

在@Ian 的大力帮助下,我终于可以弄清楚整个事情了。这是我完成的代码:在 javascript 文件中:

    $("#wiki_form_url").change(function () 
        $.ajax(
            type: "GET",
            url: "/wiki_forms/content",
            data: 
                input_url: $("#wiki_form_url").val()
            ,
            dataType: "text"
        ).done(function (data) 
                    // `data` contains the content-type
                    alert('Success');
                    console.log(data);
//                    alert(data);
                ).fail(function () 
                    alert("failed AJAX call");
                );
    );

在我的 wiki_forms 控制器中,我创建了一个名为 content 的新方法:

  def content 
    req = open(params[:input_url])
    render :text => req.content_type 
  end

然后在 routes.rb 文件中添加一条新路由:

  get "/wiki_forms/content" => 'wiki_forms#content'

并使用 /wiki_forms/content 作为 ajax 请求 url。而且,现在一切都运行良好。

【讨论】:

【参考方案2】:

这是一个 AJAX 调用示例:

$(document).ready(function () 
    $("#button_check").on("click", function () 
        $.ajax(
            type: "GET",
            url: "Your URL",
            data: 
                input_url: $("#textbox_id").val()
            ,
            dataType: "html"
        ).done(function (data) 
            // `data` contains the content-type
            alert(data);
        ).fail(function () 
            alert("failed AJAX call");
        );
    );
);

你的 HTML 是这样的:

<input type="text" id="textbox_id" />
<input type="button" id="button_check" value="Submit" />

您的 Ruby 代码将类似于:

require 'open-uri'
class TestController < ApplicationController
  def index
    req = open(params[:input_url])
    render :text => req.content_type
  end
end

我以前从未使用过 RoR,所以我不知道这是否正确或是否有效。但这是我在翻阅几个教程时可以快速想到的。这只是您似乎正在寻找的概念。您需要弄清楚如何将 URL 映射到此方法,然后更新 AJAX 选项 url 以使用它。

所以在 Javascript 代码中 - 在 done 方法中,这意味着整个 AJAX 请求是成功的,data 变量应该包含来自 Ruby 代码 req.content_type 的结果。

【讨论】:

@KeenLearner 听起来不错!我真的不知道如何将 URL 映射到控制器/动作,所以你肯定需要改变它。有很多事情我不确定 RoR :) 显然你必须更新 URL 的东西。让我知道你用这种类型的代码发现了什么。随意发布您在原始问题中尝试使用的内容以及您收到的任何错误/消息! @KeenLearner 一些事情。同样,我不确定 RoR 是如何工作的,但是对于大多数编程语言,您必须在响应中打印一个值。在我的示例中,我使用了render(我从网上搜索中找到的)。所以你不能只在你的代码中有str.content_type......你需要以某种方式呈现它。由于您没有使用控制器或我发现的任何东西,您可能需要查看 ***.com/questions/504839/… 。此外,您可能希望在 Javascript 中使用 dataType: "text" - 而不是“html”。 @KeenLearner 另外,你能看看你浏览器的控制台吗?喜欢 Firebug 或开发者工具?这样,您可以查看 AJAX 请求并查看问题可能是什么——例如 500 错误(服务器错误)或 404(未找到 URL 路径),甚至可能显示 RoR 的解释。另外,您是否可以使用 Ruby 进行调试并查看请求是否到达服务器? @KeenLearner 最好通过绝对路径引用 Ruby 文件,以确保不会出现问题。您确定 Ruby 文件位于将评估 Ruby 文件而不只是返回其内容的目录中吗?您是使用(本地)服务器提供这些文件还是仅使用文件系统访问它们? GET localhost:3000/wiki_forms/content.rb 404 (Not Found) 这是控制台中的错误【参考方案3】:

same origin policy 阻止您使用客户端 JavaScript 直接发现有关任意 URI 的信息(您控制的 URI 是另一回事)。

您需要使用其他技术(例如服务器端 Ruby)来获取该信息。

您可以通过简单地向服务器提交表单并将新网页返回给浏览器来完成此操作。

如果您不想离开页面,那么您可以使用 Ajax 传递数据。那里不乏 Ajax 教程,here is a good one from MDN。

【讨论】:

以上是关于如何在 Javascript 中获取给定 url 的内容类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 servlet 获取给定 URL 的来源?

如何从给定字符串中获取数组中所有源url的值

如何获取给定 URL 的高分辨率网站徽标(图标)

如何在 JavaScript 中获取当前 URL 的目录部分?

如何使用 javascript 从网页中获取所有图像 url?

如何使用 JavaScript 获取上一页 URL? [复制]