IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

在你的应用中添加 JSONP 的支持

扶凯 2011-08-19 23:18:10 累计浏览 3,102 次
本机暂存

昨天我们看到一个非常简单有效的使用中间件组件的例子。这次我们加入一个基本的 HTTP 的功能 JSONP.
JSONP (JSON-Padding) 是一个非官方的协议,它允许在服务器端使用 JSON 给来给客户端的 javascript callback 进行访问。这可以跨域通过基本 JSON 来包含访问的 HTML script tags 的内容


Middleware::JSONP

假定你的 Web 应用返回 JSON 的编码数据,Content-Type 是 application/json。然后 PSGI 的应用:

use JSON;
my $app = sub {
    my $env = shift;
    if ($env->{PATH_INFO} eq '/whatever.json') {
        my $body = JSON::encode_json({
            hello => 'world',
        });
        return [ 200, ['Content-Type', 'application/json'], [ $body ] ];
    }
    return [ 404, ['Content-Type', 'text/html'], ['Not Found']];
};

加入 JSONP 的支持非常简单,只要使用 Middleware::JSONP:

use Plack::Builder;
builder {
    enable "JSONP";
    $app;
};

他只是一行就完成这个功能。这个中间件检查 response 的内容为 application/json and。如果请求的是 "/whatever.json" 连接后返回标准的 JSON ,但请求 "/whatever.json?callback=myCallback" 会返回

myCallback({"hello":"world"});

和 Content-Type text/javascript. Content-Length 是会自动的输出的。

框架中怎么应用
JSONP 除了支持JSON, 能完成大多数框架做的相当琐碎的事,因为 Middleware::JSONP 是放在 Plack 的中间件那层,所以没有多少复杂的东西。
所以, JSONP 中间件应该能工作在任何 Web 框架的 JSON 的输出上,象 Catalyst:

package MyApp::View::JSON;
use base qw( Catalyst::View::JSON );
 
package MyApp::Controller::Foo;
sub hello : Local {
    my($self, $c) = @_;
    $c->stash->{message} = 'Hello World!';
    $c->forward('MyApp::View::JSON');
}

如果使用了 Catalyst::Engine::PSGI 和 Plack::Builder 你要支持 JSONP 的支持控制,如下

use MyApp;
MyApp->setup_engine('PSGI');
my $app = sub { MyApp->run(@_) };
 
use Plack::Builder;
builder {
    enable "JSONP";
    $app;
};

很意外,Catalyst::View::JSON 是我写的模块,默认支持 JSONP 回调的配置,但是有不止一种方法来做到这一点!

 这是译文,原文地址:http://advent.plackperl.org/2009/12/day-16-adding-jsonp-support-to-your-app.html

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 浅析http协议、cookies和session机制、浏览器缓存 (累计阅读 17,446)
  2. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
  3. libcurl的使用总结(二) (累计阅读 15,083)
  4. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,302)
  5. HTTP协议Keep-Alive模式详解 (累计阅读 12,105)
  6. 你必须了解的Session的本质 (累计阅读 11,441)
  7. JSONP与POST方式请求 (累计阅读 11,294)
  8. curl 命令使用cookie (累计阅读 10,016)
  9. Hello! 404 (累计阅读 9,385)
  10. 解决 nginx 反向代理网页首尾出现神秘字符的问题 (累计阅读 9,097)