Clojure/LISP REST客户端设计

3

作为一个有面向对象编程背景的人,我对Clojure API设计的推荐方式有疑问。例如,在面向对象的语言(如Python)中,我将按照以下方式使用API:

api = someWebService()
api.setWriteApiKey(WRITE_API_KEY)
api.sampleloadSong('file.mp3')

在上面的例子中,我设置了 API 密钥一次并反复调用相关方法,而无需再次传递 API 密钥。在 Clojure 或任何其他 LISP 语言家族中,推荐的做法是什么?
我需要像这样在每个函数调用中传递密钥吗?
(sampleloadSong "WRITE_API_KEY" "file.mp3")

还有其他更好的方法吗?

1
生成一个不可变的API对象,您将一遍又一遍地使用它:(make-api "the key" ...) ... (sample-load-song api song)。即使在命令式语言中,这实际上是一个相当合理的设计。 - om-nom-nom
@om-nom-nom 你能用一个简短的例子来解释一下吗? - Sibi
1个回答

6
为了解决您所描述的重复问题,您可以创建一个返回API函数并记住键(闭合它们)的函数。
(defn make-client [key] (partial api key))

然后在程序的后续部分:
(let [api-fn (make-client WRITE_API_KEY)]
  (api-fn :sample-song "song.mp3")
  ...
  (api-fn  :delete-song "other-song.mp3"))

虽然许多人认为将配置映射作为每个API调用的第一个参数传递更可取。
 (api {:key WRITE_API_KEY} ....)

还有一种常见的方法是将键定义为动态可绑定符号,并要求调用者适当地绑定它:

(def *api-key* :unset)

(defn api .... use *api-key* )

来自调用者的命名空间:

(binding [*api-key* WRITE_API_KEY]
   (api :add-song "foo.mp3"))

这种方法可能比以前不那么流行,而我个人更喜欢传递一个配置映射表,尽管这只是我的观点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接