如何实现JSONP调用

时间:2015-07-10 20:39:08

标签: jsonp clojurescript

让我先说一下这句话,我对ClojureScript来说还是一个新手。

我试图解析已关闭CORS的API。我唯一的选择是使用JSONP请求。但我不知道如何做到这一点。据我了解JSONP,它是返回回调脚本的服务器。

如何在ClojureScript中实现它?我有这个我尝试使用的片段:

(defn get-json [url callback]
  (xhr/send url callback "GET"))

(defn logcallback [event]
  (let [response (.-target event)]
    (.log js/console (response))))

(get-json ("http://www.apiurl.com/method")
           logcallback)

但我仍然收到Origin "localhost:3449" is not allowed(CORS)错误。我想这不是一个真正的JSONP请求。我怎么会这样做?

1 个答案:

答案 0 :(得分:5)

您可以使用goog.net.Jsonp。这是一个简单的例子:

(ns jsonp.core
  (:import [goog.net Jsonp]
           [goog Uri]))

(defn success-handler [res]
  (.log js/console res))

(defn error-handler [res]
  (js/alert (str "Found an error: " res)))

(let [url "http://en.wikipedia.org/w/api.php?action=opensearch&format=json&search=clojure"
      jsonp (goog.net.Jsonp. (Uri. url))]
  (.send jsonp nil success-handler error-handler))

如果您的端点返回“包装有效负载”并且用于设置回调名称的参数不是“回调”,则可以将回调参数名称作为第二个参数传递给Jsonp构造函数。以下示例获取了一个flickr feed,它需要“jsoncallback”参数:

(let [url "http://api.flickr.com/services/feeds/photos_public.gne?format=json"
      jsonp (goog.net.Jsonp. (Uri. url) "jsoncallback")]
  (.send jsonp nil success-handler error-handler))

goog.net.Jsonp将负责传递额外的参数(示例中为jsoncallback)并通过调用函数来解包有效负载。在任何一种情况下,它都将结束调用成功或错误处理程序。

你可以看看David Nolen的clojurescript 101。该帖子是从2年前开始的,但它应该仍然有效。还有another clojurescript tutorial也有类似的例子。