小书签中的 XmlHttpRequest 在 GET 上返回空响应文本?

2024-03-26

我正在尝试为我们构建的特殊 URL 缩短服务构建一个 javascript 书签http://esv.to http://esv.to用于缩短经文参考文献(即“马太福音 5 章”变为“http://esv.to/Mt5 http://esv.to/Mt5“。小书签应该执行 GET 请求http://api.esv.to/Matthew+5 http://api.esv.to/Matthew+5,它返回一个text/plain的响应http://esv.to/Mt5.

小书签本身的代码如下所示(为了便于阅读而进行了扩展):

var body = document.getElementsByTagName('body')[0], script = document.createElement('script');     
script.type = 'text/javascript';
script.src = 'http://esv.to/media/js/bookmarklet.js';
body.appendChild(script);
void(0);

代码来自http://esv.to/media/js/bookmarklet.js看起来像这样:

(function() {

    function shorten(ref, callback) {
      var url = "http://esv.to/api/" + escape(ref);
      var req = new XMLHttpRequest(); 
      req.onreadystatechange = function shortenIt() {
        if ( this.readyState == 4 && this.status == 200 ) {
          callback(req.responseText);
        };
      };
      req.open( "GET", url );
      req.send();
    };

    function doBookmarklet() {
      var ref = prompt("Enter a scripture reference or keyword search to link to:", "")
      shorten(ref, function (short) {
        prompt("Here is your shortened ESV URL:", short);
      });
    };

    doBookmarklet();

})();

当从http://esv.to http://esv.to书签本身可以正常工作。但是当在另一个页面上使用时,它就不会了。奇怪的是,当我查看 Firebug 的请求时,响应是200 OK,浏览器下载了17个字节(返回字符串的长度),但响应正文为空!不会引发任何错误,只是 XmlHttpRequest 对象上出现一个空的responseText。

现在,根据来自 Bookmarklet 的 Ajax 调用 https://stackoverflow.com/questions/664689/ajax-call-from-bookmarklet, GET 不应违反同源策略。这是一个错误吗?有解决方法吗?


跨站点 XMLHttpRequest 只能在实现 W3C 的浏览器中完成跨域资源共享 http://www.w3.org/TR/cors/规范以及服务器是否返回适当的访问控制标头(请参阅MDC 文章 https://developer.mozilla.org/En/HTTP_access_control), e.g.:

Access-Control-Allow-Origin: *

但这并不是所有浏览器都实现的。执行跨站点请求的唯一可靠方法是使用JSONP http://en.wikipedia.org/wiki/JSON#JSONP,对于(未经测试的)示例:

(function() {
    function shorten(ref, callback){
        var callbackFuncName = 'esvapiJSONPCallback' + (new Date()).valueOf();
        var script = document.createElement('script');
        script.type = "text/javascript";
        script.src = "http://esv.to/api/" + escape(ref) + "?callback=" + callbackFuncName;
        window[callbackFuncName] = function(shorturl){
            script.parentNode.removeChild(script);
            window.callbackFuncName = null;
            delete window[callbackFuncName];
            callback(shorturl);
        };
        document.getElementsByTagName("head")[0].appendChild(script); 
    }

    var ref = prompt("Enter a scripture reference or keyword search to link to:", "");
    shorten(ref, function(shorturl) {
        prompt("Here is your shortened ESV URL:", shorturl);
    });
})();

当服务器看到callback然后需要返回参数text/javascript代替text/plain,并且响应正文需要包装在所提供回调的调用中,例如:

<?php
#... after $shorturl is set ...
if(isset($_GET['callback'])){
    header('Content-Type: text/javascript');
    $callback = preg_replace('/\W+/', '', $_GET['callback']); #sanitize
    print $callback . "(" . json_encode($shorturl) . ");";
}
else {
    header("Content-Type: text/plain");
    print $shorturl;
}
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小书签中的 XmlHttpRequest 在 GET 上返回空响应文本? 的相关文章

随机推荐

  • 根据项目更改列表视图行的颜色

    我想根据列表视图的状态更改其颜色 我有两个状态 我想将 待处理 更改为红色 将 完成 更改为蓝色 这怎么可能 我不知道 因为这是我第一次在列表视图中执行此操作 也许是这样的 Dim ListView1 As ListView New Lis
  • 如何在 iOS 上从相机胶卷中检索最新的照片?

    我很难弄清楚如何在没有用户干预的情况下以编程方式检索相机胶卷中的最新照片 需要明确的是 我不想使用图像选择器 我希望应用程序在打开时自动抓取最新的照片 我知道这是可能的 因为我见过类似的应用程序可以做到这一点 但我似乎找不到任何相关信息 一
  • 捕获父容器上的单击事件,但不捕获子容器上的单击事件

    用下面的例子 HTML div class parent div class child div div CSS parent align items center background blue display flex justify
  • 如何在 Flutter 中使用另一个提供程序内部的提供程序

    我想创建一个具有以下功能的应用程序authentication service根据用户角色具有不同的权限和功能 例如消息 所以我创建了一个Provider用于用户和登录管理 另一个用于用户可以看到的消息 现在 我想在用户登录时获取消息 一次
  • 实体框架 - 对唯一索引进行 UPSERT

    我对我的问题进行了一些搜索 但找不到任何真正有帮助的东西 所以我的问题 困境仍然是这样的 我知道 mysql 数据库有一个独特的索引系统 可用于使用以下格式在同一查询中插入 更新 insert into t a b c values 1 1
  • 在 AWS Cognito Oauth2 令牌中包含用户详细信息

    我正在将 AWS cognito 与 NodeJS 后端 API 结合使用 并希望在访问令牌返回中包含用户详细信息 oauth2 令牌用户池客户端应用程序中定义范围的端点 另外如果我使用管理员启动验证API 无法将范围包含在返回访问令牌中
  • Pandas date_range - 减去 numpy timedelta 给出奇怪的结果,时间变得不是 0:00:00

    我正在尝试使用 pandas date range 功能生成一组日期 然后我想迭代这个范围并从每个日期中减去几个月 确切的月份数在循环中确定 以获得新的日期 当我这样做时 我得到了一些非常奇怪的结果 MVP get date range d
  • 如何从 int 转换为泛型 Integer?

    我对 Java 比较陌生 并且习惯了 C 中的泛型 因此在处理这段代码时遇到了一些困难 基本上 我想要一个通用方法来通过按键获取存储的 Android 首选项 并且此代码虽然丑陋 但适用于布尔值 但不适用于整数 当它因 ClassCastE
  • 如何使用 Postman 查询 Exchange EWS?

    使用Postman 如何查询本地 Exchange 2016 EWS 我有 EWS 的组织 URLhttps my organization net EWS Exchange asmx 我们使用的是 Exchange 2016 没有 Off
  • 在项目之间共享自定义 PHP 代码的最佳方式

    我正在开发一个分布式环境 主要是使用 PHP 我的很多项目共享一些相同的代码 例如我的日志代码 基于 log4php 但添加了一些自定义内容 我可以在每个项目中复制粘贴此代码 但自然地 如果我更改其中的任何内容 我需要将其重新粘贴到各处并
  • 尝试创造。初始化并格式化VHD磁盘

    一些背景 我在实验室环境中工作 遇到了许多问题 需要创建 VHD 并将其附加到虚拟机以进行压力测试 我想出了一个脚本 允许用户使过程尽可能简单 如下 vms Get VM val 0 Write Host This script is se
  • 计算月份统计数据

    我有一个捐款表 我试图计算每个月的总金额 几个月没有任何捐款 我希望结果返回 0 这是我当前的查询 Donation calculate sum amount conditions gt created at gt Time now pre
  • 从服务器端应用程序向客户端推送消息?

    我有一个基于 javascript 的客户端 当前正在轮询 NET Web 服务以获取新内容 虽然轮询有效 我对这种方法不满意 因为我正在使用系统资源并在没有接收任何更改时产生开销 我的问题是如何通知我的客户有新内容可供显示 我对实施此解决
  • 使用处理的二次曲线上的点 (p5.js)

    我使用这个公式来计算二次曲线上的点 cPx2 1 t 1 t x1 2 1 t t qcX t t x2 cPy2 1 t 1 t y1 2 1 t t qcY t t y2 当我设置 t 10 并迭代曲线时 我得到 看起来它不仅获得了曲线
  • Windows 上尝试 python 多处理时出现运行时错误

    我正在 Windows 机器上使用线程和多处理来尝试我的第一个正式的 python 程序 但我无法启动进程 Python 给出以下消息 问题是 我没有在main模块 线程在类内的单独模块中处理 EDIT 顺便说一句 这段代码在 ubuntu
  • 无法使用 jQuery 委托滚动事件

    我正在尝试使用 jQuery 在特定类别的元素上触发滚动事件 如下所示 body on scroll overflow function do stuff 然而 do stuff永远不会发生 我做了一些实验 看起来好像滚动事件不能使用 on
  • 禁用 select2 清除时打开下拉菜单

    似乎 select2 4 在清除当前所选项目时默认打开下拉列表 select2 的早期版本似乎没有这种行为 我正在尝试实现它 但目前还没有运气 有谁知道如何挂钩清除事件 以便我们可以禁用它的默认行为并清除所选选项而不打开下拉列表 干杯 铝
  • 了解 Objdump 中反汇编的二进制文件 - 输出中的字段是什么

    当我使用命令 arm linux gnueabihf objdump d a out 反汇编一个简单的 ARM 二进制文件时 得到以下输出 00008480 lt start gt 8480 f04f 0b00 mov w fp 0 848
  • 返回具有 ModelState 错误的键列表

    如何返回所有有错误的键的列表 数组 我尝试执行以下操作 但它说由于某种原因我无法进行这种表达 ModelState ToList item gt item Value Errors Count gt 0 var errors from mo
  • 小书签中的 XmlHttpRequest 在 GET 上返回空响应文本?

    我正在尝试为我们构建的特殊 URL 缩短服务构建一个 javascript 书签http esv to http esv to用于缩短经文参考文献 即 马太福音 5 章 变为 http esv to Mt5 http esv to Mt5