API 停止支持 JSONP

Posted

技术标签:

【中文标题】API 停止支持 JSONP【英文标题】:API stop supporting JSONP 【发布时间】:2013-05-07 06:27:34 【问题描述】:

我用 php 做了一个简单的 API。 这个 API 回显是一个使用 json_encode 的对象。

举例:

echo json_encode($obj);

我正在使用 jQuery 从这个 API 中检索信息。 在测试脚本和 API 时,它们都在同一台服务器上运行。 一切正常。

jQuery 的一个例子:

$.ajax(

    url: "php/api/test.php"
    dataType: "json",
    type: "POST",
    succes: function(data) 
        console.log("success");
    ,
    error: function(response) 
        console.log("error");
    
);

现在这工作正常。 但是,由于 API 在外部服务器上运行,这不再起作用(是的,我将 url 更改为正确的)。

我必须更改 API 和 javascript 才能使用 JSONP 在 jQuery 最终从 API 接收信息之前。

我的 jQuery 现在是:

$.ajax(

    url: "http://externalserver/php/api/test.php"
    dataType: "jsonp",
    type: "POST",
    succes: function(data) 
        console.log("success");
    ,
    error: function(response) 
        console.log("error");
    
);

PHP 将返回这个以便工作:

echo $_REQUEST['callback'] . '(' . json_encode($obj) . ')';

现在我实际上宁愿使用 JSON 而不是 JSONP。

我知道我需要更改 PHP 文件以让 API 接受来自像我这样的外部脚本的传入请求。

你能告诉我我需要做什么吗?

【问题讨论】:

你可以使用 ajax 这个 我不明白您的问题,请说明您在寻找什么以及您需要什么。 @shin:你认为 OP 在做什么? JSON、jQ PHP、外部服务器……都指向 AJAX,不是吗?致 OP:您是在问如何让 X 域 XhttpRequests 工作? 现在调用的是外部服务器(我假设它与调用 javascript 的域不同),您只能使用 JSONP 或 CORS 请求。如果您不想使用这些方法,则必须使用服务器端请求来获取数据。 我更改了问题,希望它能澄清事情@RoryMcCrossan:在java中,您可以在页眉中添加一些内容,以便他接受对服务器的正常json(不是jsonp)调用(实际上是在其他域)。 【参考方案1】:

AFAIK,您遇到了 AJAX 请求的跨域问题。对于这个问题,最简单、最跨浏览器的修复方法是使用 JSONP。您的 PHP 脚本中没有任何确定的方法可以解决此问题,因为它部分取决于客户端。 Not a lot of people know how to disable the cross-domain ban either,出于测试目的,您可以考虑禁用浏览器安全性。

只要使用 JSONP,老实说,它会为您省去很多麻烦。如果您已经在使用 jQuery,那么您不妨使用它的最佳特性(跨域的东西)。 如果你打算放弃 jQuery,read up on what CORS requests entail。

【讨论】:

1) 禁用浏览器安全 = 坏,2) JSONP = OP 不想使用它,它也非常受限制,例如没有 POST 请求可能(如果您使用 web 服务,通常需要) 3)“您无法对 PHP 脚本执行任何操作来解决此问题”= 错误 - 您只需要设置一些标头来解决此问题跨度> @Christoph: 1) 你可以这样做,我从不推荐它。 2)OP不想使用它,而我说考虑到他的情况,这将是最简单的解决方法。如果 OP 正在测试某些东西,稍后将在同一台服务器上运行,那么 JSONP 是最容易使用的东西。 3) 足够公平,尽管这意味着能够发送初始请求。有时,这是不可能的 2) 使用 JSONP 将需要在服务器端和客户端更改代码,并且仍然会引入各种限制,您在编写 (REST) Web 服务时无法承受(对于 OP 来说可能就是这种情况,因为他提到了一个自制的API)。设置标头只需要更改服务器端代码。浏览器会检查这些标题,所以我不明白你的第 3 点 我明白@EliasVanOotegem 的意思。出于安全原因更改访问控制可能不明智。也许在特定主题或答案中添加赞成和反对是好的? @BonifatiusK 如果您这样争论,那么您在使用 JSONP 时也会遇到同样的问题,这实际上是 SOP 的一种解决方法,浏览器会遵守(并且您可以使用 JSPON)。最好使用干净的方式,并使用您希望从 (*.yourdomain/*) 调用的确切域声明 CORS-Header。【参考方案2】:

您需要在标头中设置允许 CrossOriginRessourceSharing (CORS) 的参数,否则您的浏览器将根据同源策略 (SOP) 阻止这些调用。如果您在 php 中设置 allow-origin-response-header,则一切都应该按预期工作。

推杆

header('Access-Control-Allow-Origin: *');  

在您的test.php 顶部将解决您的问题。 (或者最好将 * 替换为您的呼叫来自的特定域)。

【讨论】:

以上是关于API 停止支持 JSONP的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 停止支持内联安装扩展

协商后跨源 SignalR 连接停止

API 调用完成后显示 CircularProgressIndicator() 不会停止

通过扩展让ASP.NET Web API支持JSONP

Youtube api - 停止视频

Windows 7停止支持后,如何免费获得安全更新?