3.0.1 • Published 4 years ago
rescript-request v3.0.1
Request
ReScript wrapper for XMLHttpRequest
Installation
Run the following in your console:
$ yarn add rescript-future rescript-requestThen add rescript-request and rescript-future to your bsconfig.json's bs-dependencies:
{
"bs-dependencies": [
+ "rescript-request",
+ "rescript-future
]
}Basics
Request.make performs a request and returns a Future.t containing a result<response, error>.
Request.make(~url="/api/health", ~responseType=Text, ())
->Future.get(Js.log)
// Ok({
// status: 200,
// ok: true,
// response: "{\"ok\":true}",
// })
Request.make(~url="/api/health", ~responseType=Text, ())
->Future.get(Js.log)
// Error(#NetworkError)
Request.make(~url="/api/health", ~responseType=Text, ~timeout=10, ())
->Future.get(Js.log)
// Error(#Timeout)
Request.make(~url="/api/health", ~responseType=Json, ())
->Future.get(Js.log)
// Ok({
// status: 200,
// ok: true,
// response: {"ok":true},
// })
type response = {"ok": bool}
Request.make(
~url="/api/health",
~responseType=(JsonAsAny: Request.responseType<response>),
()
)
->Future.get(Js.log)
// Ok({
// status: 200,
// ok: true,
// response: {"ok":true},
// })Parameters
url: string,method:#GET(default),#POST,#OPTIONS,#PATCH,#PUTor#DELETEresponseType:Text: (default) response will bestringArrayBuffer: response will beJs.TypedArray2.ArrayBuffer.tDocument: response will beDom.documentBlob: response will beRequest.blobJson: response will beJs.Json.tJsonAsAny: response will be any, use with(JsonAsAny: Request.responseType<yourType>)
body: anyheaders:Js.Dictcontaining the headerswithCredentials: boolonLoadStartonProgresstimeout: int
Response
The response is a record containing:
status:intok:boolresponse: the decoded response, which is anoption
Errors
#NetworkRequestFailed#Timeout
Mapping errors to your own type
You can map the Request.error types to your own:
type error =
| Empty
| NetworkError
| Timeout
let mapError = error => {
switch error {
| #NetworkRequestFailed => NetworkError
| #Timeout => Timeout
}
}
let emptyToError = ({Request.response: response}) => {
switch response {
| None => Error(Empty)
| Some(value) => Ok(value)
}
}
let requestApi = (~url, ~responseType) => {
Request.make(~url, ~responseType, ())
->Future.mapError(~propagateCancel=true, mapError)
->Future.mapResult(~propagateCancel=true, emptyToError)
}Don't forget to use the
propagateCanceloption so that callingFuture.cancelon therequestApireturn value aborts the request!