2017-07-19 6 views
2

私は初めてSuaveをプレイしてきましたが、私が理解していないことがはっきりとあります。 私は何を達成しようとしていることは簡単なのREST APIを実装することです:ネスティング・サヴァWebPart

  • ユーザーは、金融商品
  • に関する情報は、さらに、すべての機器は今の価格について

のリストを持ってもらうことができます簡単に私はGETメソッドのみに焦点を当てています。コードの

マイ非常に基本的な部分はここにある:

[<AutoOpen>] 
module RestFul =  

    let JSON v =  
     let jsonSerializerSettings = new JsonSerializerSettings() 
     jsonSerializerSettings.ContractResolver <- new CamelCasePropertyNamesContractResolver() 

     JsonConvert.SerializeObject(v, jsonSerializerSettings) 
     |> OK 
     >=> Writers.setMimeType "application/json; charset=utf-8" 

    let fromJson<'a> json = 
     JsonConvert.DeserializeObject(json, typeof<'a>) :?> 'a  

    let getResourceFromReq<'a> (req : HttpRequest) = 
     let getString rawForm = System.Text.Encoding.UTF8.GetString(rawForm) 
     req.rawForm |> getString |> fromJson<'a> 

    type RestResource<'a> = { 
     GetById : int -> 'a option 
     GetPricesById : int -> 'a option 
    } 

    let rest resource = 

     let handleResource requestError = function 
      | Some r -> r |> JSON 
      | _ -> requestError 

     let getResourceById = 
      resource.GetById >> handleResource (NOT_FOUND "Resource not found") 

     let getPricesById = 
      resource.GetPricesById >> handleResource (NOT_FOUND "Resource not found") 

     choose [ 
      GET >=> pathScan "/instrument/%d" getResourceById 
      GET >=> pathScan "/instrument/%d/prices" getPricesById 
     ] 


module Main = 
    [<EntryPoint>] 
    let main argv = 

     let webPart = rest { 
       GetById = fun i -> Some i // placeholder 
       GetPricesById = fun i -> Some i // placeholder, it'll be a list eventually 
      } 

     startWebServer defaultConfig webPart 
     0 

私はこのようにWebパーツを定義します。

choose [ 
    GET >=> pathScan "/instrument/%d" getResourceById // Returns the instrument static data 
    GET >=> pathScan "/instrument/%d/prices" getPricesById // Returns price list for the instrument 
] 

その後、すべてが正常に動作します。ウェブパーツを入れ子にする方法があるかどうかは疑問だ。

また、私がRestAPIについて知っているように、私の推論にはギャップがあるかもしれません。私はそういう意味でネスト価格のエンドポイントは、価格が楽器の財産とみなされていることを単に明らかにしていると思います。

+2

これは動作しません。あなたは "現在の要求"という概念を放棄しなければなりません。 Suaveにはこのようなことはありません。それはすべての機能構成です。 –

答えて

4

これまでのリクエストにアクセスするのは反サベイのようなものです;私たちは、何が起こったのかにかかわらず、物事を独立して起こせるようにしたいと考えています。だから、おそらくこれを解決するより良い考え方は、パスの終わりに価格を追加するだけだろうか?

choose [ 
    GET >=> pathScan "/instrument/%d" getResourceById 
    GET >=> pathScan "/instrument/%d/prices" getPricesById 
] 
+0

私の現在のソリューションとまったく同じです(つまり、投稿したものと動作しているもの)。 また、「アンチサベイ」とみなされるものの説明に感謝します。それは私が聞きたかったものです。 –

+1

私は彼が*以前のリクエスト*にアクセスしようとしているとは思わない。ネストされた 'pathScan'チェーンの以前の部分によく似ています。これは何度も出てきた機能要求です(何人かの 'subPath'コンビネータを求めている人)、今は他の機能要求がどこに提出されたのかわかりません。私がそれらを見つけるなら、私はそれらをリンクさせます。しかし今、Suaveはその機能を提供していません。 – rmunn