- From: Kang-Hao (Kenny) Lu <kennyluck@w3.org>
- Date: Fri, 23 Dec 2011 12:09:30 +0800
- To: Timothy Chien <timdream@gmail.com>
- CC: W3C HTML5 中文興趣小組 <public-html-ig-zh@w3.org>
(11/12/23 11:13), Timothy Chien wrote: > 可以解釋一下 xhr.responseType = "jsonp"; 的行為嗎? > 是說這樣 callback= 這個參數還要自己加嗎,還是 xhr 會自動加上去? 'callback=' 是 URL 的一部分,xhr.open 裡面的 URL 還是要自己寫的,只是等 於什麼對後來 xhr.reponse 的東西沒太大影響(合法的 ECMAScript 「identifier」就行)。 當 xhr.responseType = "jsonp" 的時後,xhr.response 就會回傳後面語法的 <js-literal> 丟進去 JSON.parse 的結果。所以也不需要定義一個全局 callback 函數。 > 因為現有的 server 實作是: > > * JSONP: allow cross-origin > * JSON: does NOT allow cross-origin > > 如果不需要傳 callback= 就可以把 JSON 的內容當成 JSONP 抓下來解析的話,會天下大亂 ... JSONP 的語法原文是用: <js identifier> '(' <js-literal> ')' 而 JSON 不符合這個語法,所以不能跨來源。(respone 是 null、responseText 是 "" 等等) 你的講法就是 Jonas Sicking 反駁 Mark Miller 「可以解析成 JS 的就應該要可 以跨域」的論點很像,因為 JSON 就是合法的 JS 的一種,所以現在才會變成「可 以解析成 JSONP 的就應該要可以跨域」。(不過本來就是這樣子) > [恕刪] > > 我是覺得這個功能很好啦,是很好的 adoption path(會用 JSONP 的人很容易學的會),但是不是取代 CORS 標準的方法。 如果只是單單是用 " Access-Control-Allow-Origin: * " 而已,那這個方法真是 簡單多了。主要好處是以後就不需要冒險把身心都託付給第三方 <script> 的情況 下,用第三方**現有**的 JSONP API 了。(現在很多大型網站因為安全問題不敢 用 Plurk API 之類的吧?) 相反的啟示是,現在提供 JSONP API 的供應商以後可能就沒有把 API 偷改成 callback(xhr.send(document.cookie)) 等等反竊取使用 API 網站的資料的攻擊 權利(?)了,因為 response="jsonp" 根本不是用估價(evaluate)拿回 JSON 的,而是 JSON.parse。 有這類 JSONP API 供應商想說什麼的嗎?
Received on Friday, 23 December 2011 04:10:01 UTC