如何实现JSONP调用

tol*_*gap 1 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)
Run Code Online (Sandbox Code Playgroud)

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

nbe*_*ger 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))
Run Code Online (Sandbox Code Playgroud)

如果您的端点返回"包装的有效负载"并且用于设置回调名称的参数不是"回调",则可以将回调参数名称作为第二个参数传递给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))
Run Code Online (Sandbox Code Playgroud)

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

你可以看看David Nolen的clojurescript 101.该帖子是从2年前开始的,但它应该仍然有效.还有另一个clojurescript教程,它有一个类似的例子.