纯Node.js运行时fetch的purescript实现,无法在浏览器中运行。
该库是fetch的中层封装。
使用spago时常需要使用代理,然而spago使用的js-fetch 底层依然是fetch,目前并没有代理功能,于是想着能否自己实现一个。同时实现一个更高层的封装。
后来发现已经有这个提案了。 于是可以等这个功能实现,就可以在自己的代码里提供这个功能。
为了满足纯函数式范式,很多不会改变原始值(追求不可变性)的操作会导致性能不足,每次都会全量复制一份。
同时为了减少不必要依赖(有些库仅仅简单封装,没有提供不可变性数所结构),部分功能没有支持,例如Buffer
和TypedArray
。
可以使用fetch'
直接发送请求,跟运行fetch(url)
一样的效果。
import Golem.Fetch (fetch')
action :: Aff Unit
action = do
rsp <- fetch' "http://httpbin.io"
{-# ... #-}
返回一个Response,效果与await fetch("http://httpbin.io")
相同。
fetch
接受两个参数,跟node的fetch
效果一样。
import Golem.Fetch (fetch)
import Golem.Fetch.Request (defaultRequest, setHeader)
action :: Aff Unit
action = do
let req = setHeader "Header1" "Value1" $ setHeader "X-Ver" "1" defaultRequest
rsp <- fetch "http://httpbin.io" req
{-# ... #-}
效果跟node的fetch
一致,同样返回一个Response。
defaultRequest
提供默认请求体,可以在Node.Fetch.Request
查看所有操作。
目前仅提供了text()
和json()
方法,不支持二进制。
action :: Aff Unit
action = do
rsp <- fetch
rspText :: String <- text rsp
{-# ... #-}
text
相当于调用rsp.text()
。
action :: Aff Unit
action = do
rsp <- fetch
jsonValue :: Json <- json rsp
{-# ... #-}
json
相当于调用rsp.json()
,返回一个Json
对象,需要用户自行处理,目前还未支持DecodeJson
操作。
JSON现在互联网最普遍格式,所以理所当然会支持这个格式。
import Golem.Fetch.Request (setBodyJson, defaultRequest)
data Dog = Dog {-# 用户自行实现 #-}
instance EncodeJson Dog where
encodeJson = {-# 自行实现 #-}
action :: Aff Unit
action = do
let body = Dog
rsp <- fetch "http://httpio.com" $ setBodyJson body defaultRequest
{-# ... #-}
setBodyJson
能自动设置请求头Content-Type: application/json
,自动转义body。
setBodyJson'
是setBodyJson
简化版,不会设置请求头,仅转义body。
使用方法同发送JSON,唯一不同在于不依赖EncodeJson
,仅需要传URLSearchParams
。
import Golem.Fetch.Request (setBodyForm, defaultRequest)
import Golem.Fetch.URLSearch as S
action :: Aff Unit
action = do
let body = S.singleton "key" "value"
rsp <- fetch "http://httpio.com" $ setBodyForm body defaultRequest
{-# ... #-}
同样提供setBodyForm'
简化版。
AGPL v3