首页 > JavaScript > JSONP与POST方式请求
2011十一月25

JSONP与POST方式请求

JSONP是一种非官方协议,可以解决AJAX跨域提交数据情况。

安全部门的同事测试发现,都是GET的请求,相比较而言不如POST安全,还是尽量改了吧。

拖啊拖,终于还有别的业务要这个接口,想了想还是改了吧,反正听人劝吃饱饭嘛 。但是,JSONP真的支持POST提交吗?

先是一天夜里加班无聊,做了一下POST,发现请求发送过去的METHOD为OPTIONS,而不是POST,同时没有得到返回结果。

今天下午抽时间,特意处理一下这个事情。事实证明OPTIONS的状态可能是我拼错东西了,反正今天没有重现。不过当我把数据改为POST后,我发现COOKIE已经生成了,证明我数据提交过去了。但是content里没有返回值,Firebug看不到,但是Fiddler可以看到。

jsonp post 截图

POST提交,firebug之所以看不到的原因是,我的执行跨域了。我执行的域名为localhost,而提交请求的域名为公司域名。

一计不成,又生一计。咋的活人还能让尿憋死?

jQuery里面有N多jsonp的方法,挨个试呗:getScript getJson ajax( 指定dataType为jsonp或script)

发现jQuery的getScript不支持POST,但是其等同于$.ajax(datatype:script)啊,咱再指定type为Post不就成了嘛 。不过改完后,发现还是变成了GET请求,很奇怪,翻看API如下:

“script”: Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, “_=[TIMESTAMP]“, to the URL unless the cache option is set to true. Note: This will turn POSTs into GETs for remote-domain requests.

看来,你即使设置为POST,jQuery发现是getScript时,也会自动给你转成GET。测试 datatype为jsonp时 POST请求同样会被转化成GET。

难道是JSONP不支持POST方式发起请求吗?

一个外国友人,和咱遇到同样的问题:http://stackoverflow.com/questions/3860111/how-to-make-a-jsonp-post-request-that-specifies-contenttype-with-jquery

得到的回答是这样的:

找到这篇文章,《JSONP跨域的原理解析》 从文中可以看出,其实使用特殊的方法也是可以支持POST的,不过太过繁琐。作者举的例子为:动态创建iframe方式POST跨域。

最后,我想说的是,要想支持POST方式的JSONP很难,咱就别难为自己了,这个接口不改了 – -!!

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2011/11/25/2239/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

9 Responses to “JSONP与POST方式请求”

  1. #1 过两天来看答案 回复 | 引用 Post:2011-11-25 23:18

    不会javascript,博主是怎么学Jquery的,有什么书籍推荐吗

    [回复]

  2. #2 simaopig 回复 | 引用 Post:2011-11-28 09:51

    @过两天来看答案
    瞎学的,而且也确实没学好。只是偶尔闲着研究了一会儿。:)

    [回复]

  3. #3 流年 回复 | 引用 Post:2011-12-03 20:35

    jsonp一般是获取数据来执行,就这个而言,自然是用 get 而不是 post

    [回复]

  4. #4 十年灯 回复 | 引用 Post:2011-12-06 16:43

    天书 。。。。所以我只留言证明我来过 8)

    [回复]

  5. #5 alswl 回复 | 引用 Post:2011-12-06 21:11

    jsonp的跨域原理注定是要get的。
    我第一次看到有可以post的方案,不过话说回来,这个意义不大吧~

    [回复]

  6. #6 齐迹 回复 | 引用 Post:2011-12-19 15:41

    满以为博主解决了这个问题!之前苦于get传输的大小很多都受到限制!

    [回复]

  7. #7 圣韩美 回复 | 引用 Post:2011-12-26 15:39

    :-? 果然是天书

    [回复]

  8. #8 青浦团购 回复 | 引用 Post:2011-12-29 15:00

    咋的活人还能让尿憋死
    不认识这东西,也说不上什么?

    [回复]

  9. #9 千计谷 回复 | 引用 Post:2012-02-01 11:44

    对jquery稍有点研究,
    对于博主说的说的不能使用post方法,我觉得是应该的,
    毕竟跨域操作数据是危险的。
    国际标准是不允许的,
    所以实现方法也是通过其他方式绕行。

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)