当前位置: 首页 > 面试题库 >

对JSONP请求的工作方式感到困惑

冀永寿
2023-03-14
问题内容

我在理解jsonp请求如何工作的细节方面遇到麻烦。我已经阅读了包括jsonp上的wiki在内的多个资源,并且对于在进行jsonp调用时回调实际上如何保留从服务器返回的函数仍然很困惑。例如,在Wiki中,请求的源设置为:

src="http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"

jsonp = parseResponse究竟实际在做什么/意味着什么?然后他们继续说有效负载是:

parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});

这是如何运作的?我对整个回调功能感到困惑。函数名称parseResponse被传递到服务器,以某种方式返回的数据成为该函数的参数?有人可以清楚地解释一下如何从jsonp请求中检索/使用数据吗?


问题答案:

回调是您在自己的代码中定义的函数。jsonp服务器将使用与您指定的回调函数相同的函数调用包装其响应。

这会发生什么:

1)您的代码创建JSONP请求,这将导致一个新的<script>块,如下所示:

<script src="http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"></script>

2)该新脚本标记由您的浏览器执行,从而导致对JSONP服务器的请求。它以

parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});

3)由于此请求来自脚本标签,因此与您原本放置的位置几乎完全相同

<script>
    parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
</script>

进入您的页面。

4)现在已经从远程服务器加载了此新脚本,现在将执行该脚本,并且唯一要做的就是函数调用,parseResponse()将JSON数据作为函数调用的唯一参数传入。

因此,在代码的其他地方,您将拥有:

function parseResponse(data) {
     alert(data.Name); // outputs 'Foo'
}

基本上,JSONP是一种让第三方服务器直接将函数调用注入您的页面的方式,从而绕过浏览器的同源脚本安全策略。请注意,这是设计使然不安全的。您依赖于远程服务是否值得接受并且没有恶意。没有什么能阻止不良服务返回一些JS代码来窃取您的银行/
Facebook /任何凭证。例如… JSONP响应本来可以

 internalUseOnlyFunction('deleteHarddrive');

而不是parseReponse(…)。如果远程站点知道您的代码结构,则可以使用该代码执行任意操作,因为您已将您的前门完全打开以允许该站点执行其所需的任何操作。



 类似资料:
  • 我有一个角度控制器: 正在使用我创建的服务: 身份验证服务使用的是一个Cordova插件,它不属于角度世界。我想我不清楚什么时候需要使用$范围$应用来更新$范围,如果不更新的话。我的错误假设是,因为我已将逻辑包装到角度服务中,所以在本例中我不需要它,但除非我包装$范围,否则不会更新任何内容。userInfo=

  • 我正在阅读一个示例代码,它将添加一个10像素宽的灰色框架,通过用lambda表达式调用它来替换图像边界上的像素: 我对 lambda 表达式感到困惑: > 要为图形添加框架,我认为" “我真的不明白?颜色。白:c”。第一,为什么它们在前一个括号之外?其次,问号(?)意思是? 提前感谢您的帮助。

  • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个

  • 所以我一直在读Kafka的语义学,我对它的工作原理有点困惑。 我理解生产者如何避免发送重复的消息(以防代理的ack失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,一次是如何工作的。Kafka不会在这种情况下重试吗?

  • 问题内容: 据我了解,当在工厂内部时,我返回一个注入到控制器中的对象。在服务内部时,我使用而不是返回任何东西来处理对象。 我当时以为服务 始终是单例 ,并且每个控制器都注入了一个 新的工厂对象 。但是,事实证明,工厂对象也是单例对象吗? 示例代码演示: 当改变的事实证明,在也发生了变化,比如是一个单身? 我的假设是在工厂的控制器中注入了新实例? 问题答案: 所有角度服务都是单例 : Docs(请参

  • 问题内容: 我可以理解以下定义: 每个对象都有一个标识,一个类型和一个值。一旦创建了对象,其身份就永远不会改变。您可能会认为它是对象在内存中的地址。所述操作者比较两个对象的身份; 该函数返回一个表示其身份的整数。 我认为上面的定义在创建“某物”时起作用,例如: 但是我不理解: 我还没有创建任何东西。那么整数“ 1”如何具有ID?这是否意味着只要我在Python Shell中“提及” 1,便立即将其