15

私のアプリケーションはブックマークレットを使用しており、CORS を許可しMyRouteRて、ブックマークレット コードが AJAX リクエストにこのルートを使用できるようにする必要があります。

config/routes の最初のドラフトではMyRouteR、PUT という 1 つのリクエスト メソッドのみをサポートしました。しかし、ブラウザーが CORS プリフライト リクエストに使用する OPTIONS メソッドもサポートする必要があることが判明しました。

config/routes で次のようになりました。

/myroute MyRouteR PUT OPTIONS

このルートのメソッド リストに OPTIONS を追加すると自動的に CORS がサポートされるように、config/routes を処理する Template Haskell に関連する機械がいくつかあることを期待していましたが、さいころはありません。世界の終わりではありませんが、それは理にかなっていて、そのようにエレガントに感じたでしょう.

CORS を機能させるために、ルートに OPTIONS ハンドラーを指定しました。

optionsMyRouteR :: Handler RepPlain
optionsMyRouteR = do
    addHeader "Access-Control-Allow-Origin" "*"
    addHeader "Access-Control-Allow-Methods" "PUT, OPTIONS"
    return $ RepPlain $ toContent ("" :: Text)

putMyRouteR :: Handler RepJson
putMyRouteR = do
    addHeader "Access-Control-Allow-Origin" "*"
    -- more stuff ...

これは機能しますが、ボイラープレートであるため、少しYesodicではないように感じます. だから、2つの質問:

  1. Yesodicよりも優れた形容詞はありますか?
  2. ルートがクロスオリジンリクエストをサポートできるようにする別のより良い方法はありますか?
4

1 に答える 1

3

更新: 他の誰かがこのための一般的なミドルウェアを公開しました: http://hackage.haskell.org/package/wai-cors


Middleware私は現在同じことに取り組んでおり、まだ解決策を実装していませんが、ウィキページのサンプルコードに似たWAIを介して実行できると思います 他のドメインからのWOFFフォントへのアクセスを許可する (CORS) . これにより、CORS コードを 1 回書くだけで、同じことを繰り返す必要がなくなります。

WOFF フォントのクロスオリジン アクセスを追加する上記のリンクのサンプル コード:

addCORStoWOFF :: W.Middleware
addCORStoWOFF app = fmap updateHeaders . app
  where
    updateHeaders (W.ResponseFile    status headers fp mpart) = W.ResponseFile    status (new headers) fp mpart
    updateHeaders (W.ResponseBuilder status headers builder)  = W.ResponseBuilder status (new headers) builder
    updateHeaders (W.ResponseSource  status headers src)      = W.ResponseSource  status (new headers) src
    new headers | woff      = cors : headers
                | otherwise =        headers
      where woff = lookup HT.hContentType headers == Just "application/font-woff"
            cors = ("Access-Control-Allow-Origin", "*")
于 2014-03-13T21:43:36.177 に答える