2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

reason_mlAdvent Calendar 2017

Day 8

bs-fetch使ってみた

Last updated at Posted at 2017-12-18

MLたいして触ったことない(※これ書くときに初めて触った) & 本職サーバーサイド&インフラで、
WEBは2年前Angular書いて以降は追えてない程度マンですが、AdventCalender誘ってもらったので書いてみます。

ReasonでAPIリクエストする処理を書こうとして、XHRかFetchないか探してみたら
bs-fetchを見つけたので使ってみたのを雑に書きました。

導入

1日目の記事テンプレート落としてきて、Installationのnpm installとbsconfig追記だけなので割愛。

使い方

サンプルコードには↓が載っていた。ヘッダ指定とかこまいところどうするのかわからん・・・

let _ =
  Js.Promise.(
    Fetch.fetch("/api/hellos/1")
    |> then_(Fetch.Response.text)
    |> then_((text) => print_endline(text) |> resolve)
  );

Fetch.fetch系のシグニチャをみると、4通り実行方法が用意されている模様

external fetch : string -> response Js.Promise.t = "" [@@bs.val]
external fetchWithInit : string -> requestInit -> response Js.Promise.t = "fetch" [@@bs.val]
external fetchWithRequest : request -> response Js.Promise.t = "fetch" [@@bs.val]
external fetchWithRequestInit : request -> requestInit -> response Js.Promise.t = "fetch" [@@bs.val]
  • fetchは第一引数にurlのstringだけ渡してシンプルにGET
  • fetchWithInitは第一引数にurlのstring,第二引数にrequestInit型を渡して実行
  • fetchWithRequestは第一引数にrequest型を渡して実行
  • fetchWithRequestInitは第一引数にurlのrequest,第二引数にrequestInit型を渡して実行

Initは適用前、無印は適用後を表現しているのかな・・・?
ヘッダやbody指定してfetchするならfetchWithInitを使えば良さそう。

ドキュメントなさ気なのでソースサンプルから読み解く

HeaderInit

シグニチャ

  external make : < .. > Js.t -> t = "%identity"
  external makeWithArray : (string * string) array -> t = "%identity"

タプルのArray突っ込めば生成できる模様

Fetch.HeadersInit.makeWithArray([|("Accept-Encoding","gzip"), ("bar","foo")|])

RequestInit

シグニチャ↓

  let make
    ?method_:(method_: requestMethod option) 
    ?headers:(headers: headersInit option)
    ?body:(body: bodyInit option)
    ?referrer:(referrer: string option) 
    ?referrerPolicy:(referrerPolicy: referrerPolicy = None) 
    ?mode:(mode: requestMode option) 
    ?credentials:(credentials: requestCredentials option) 
    ?cache:(cache: requestCache option) 
    ?redirect:(redirect: requestRedirect option) 
    ?integrity:(integrity: string = "") 
    ?keepalive:(keepalive: bool option)
let requestInit = Fetch.RequestInit.make(
  ~method_=Post, 
  ~headers=Fetch.HeadersInit.makeWithArray([|("Accept-Encoding","gzip"), ("bar","foo")|]),
  ~mode=NoCORS, 
  () /* 指定していないoption型引数を埋める */
)

こまい設定できた。同じ要領でBodyInit使えばBody指定もできました。

実行

let _ =
  Js.Promise.(
    Fetch.fetchWithInit(
      "http://localhost:4000",
      Fetch.RequestInit.make(
        ~method_=Get,
        ~headers=Fetch.HeadersInit.makeWithArray([|("Accept-Encoding","gzip"), ("bar","foo")|]),
        ~mode=NoCORS,
      ())
    )
    |> then_((resp) => Fetch.Response.text(resp))
    |> then_((text) => print_endline(text) |> resolve)
    |> catch((e) => Js.log(e) |> resolve)
  );

直感的にかけて良い

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?