問題タブ [servant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
157 参照

haskell - サーバントは常に ReaderT モナドの初期値を教えてくれる

私はServantを学んでいて、簡単なサービスを書いています。ソースコードは次のとおりです。

defaultServicesリクエストごとに新しいものを提供するサーバントのようです。サービス (name = "file") を作成するために POST を送信しましたが、GET 要求でサービスを取得できません。サーバントのリクエスト間でデータを共有する方法は?

0 投票する
1 に答える
1104 参照

haskell - カスタム サーバント ハンドラで HTTP ステータスに応答するにはどうすればよいですか?

カスタム サーバント ハンドラを作成しました

しかし、次の関数で 404-not-found ステータス コードをクライアントに応答する方法が見つかりませんでした。

で 404 ステータス コードを送信する方法は????

0 投票する
2 に答える
234 参照

haskell - 型インスタンスとファントム型

奇妙なエラーが発生しました。修正方法が見つかりません。私はサーバントを使用しており、一般的な認証ライブラリを構築しようとしています (たとえば、デフォルトではバックエンドはありません)。

コードは次のとおりです。

Idは別のタイプのファミリーです。エラーメッセージは次のとおりです。

このコードを修正する方法を知っていますか?

0 投票する
0 に答える
60 参照

servant - :: BasicAuthCheck User 内の :: Hasql.Pool.Pool にアクセスするにはどうすればよいですか?

:: Hasql.Pool.Pool私は通常、引数としてserve関数に渡しrunますmain :: IO ()

:: BasicAuthCheck Userしかし、認証に使用することを計画し:: Hasql.Pool.Pool始めて以来:: BasicAuthCheck User:: BasicAuthData -> IO (BasicAuthResult User).

私の現在の回避策は、:: Hasql.Pool.Pool内部に別のものを作成し、:: BasicAuthData -> IO (BasicAuthResult User)それを使用してユーザーを認証することです。

別の接続プールを作成するよりもエレガントな方法はありますか?

0 投票する
1 に答える
923 参照

haskell - サーバントを使用したデータベース支援の REST API?

シンプルな概念実証のサーバント API を設定する際に問題が発生しています。これは私の User データ型と API タイプです。

このハンドラー メソッドは、次のように postgresql-simple を使用します。

データベースへの接続やルーティング メソッドなどのボイラープレート コードは省略されています。問題は、私が POST リクエストを行う場合、やりたいことは新しいユーザーを作成することなので、JSON を提供することです。

しかし、私のプログラムは実行時に失敗します

API は id フィールドを持つ User を指定したため、これは理にかなっています。しかし、リクエストで偽のIDを渡す必要はありません(postgresによって順次割り当てられるため)。また、id フィールドを User データ型から移動することもできません。これは、別のエンドポイントに GET 要求を行うときにモデルとデータベースの不一致が原因で postgres-simple が失敗するためです (これにより、ID による取得が行われます。上記には含まれていません)。 )。ここで何をすればいいですか?カスタム FromJson インスタンスを作成しますか? Data.Aeson.TH オプション フラグ omitNothingFields を True に設定し、id フィールドを Maybe Int に設定しようとしましたが、それもうまくいきませんでした。アドバイスをいただければ幸いです。

0 投票する
0 に答える
223 参照

haskell - servant-client で動的リクエストを生成する

次のように、サーバント DSL で記述されたサーバントの API があるとします。

type API = "some" :> QueryParam "a" Int :> QueryParam "b" Double:> Get '[JSON] Int

HasClient インスタンスがあるため、クライアントがあります。

その API をすべて手動で呼び出すのはよいことです。しかし、たとえばテキスト ファイルから HTTP 要求を生成する必要がある場合はどうすればよいでしょうか。

次のように、テキスト ファイルからすべてのクエリ引数を解析APIする (自分の) 型クラスを使用して 単純なパーサーを生成できます。HasParser

しかし、解析の結果をクライアントの型と結び付けるにはどうすればよいでしょうか?

もちろん、各メソッドの値レベルですべてのパーサーを作成できますが、タイプ レベルでAPIすべての thar パーサーを生成したいので、特にパーサーは関数を生成する必要があります。APIAPI

Manager -> BaseUrl -> ClientM Int

それは可能ですか?

アップデート。

わかりました、質問は実際には2つで構成されています:

1) ユニバーサル クライアントを生成する方法

2) パーサーを生成する方法、実際に解析結果を保持するために使用する型。

(1) は非常に単純ですが、非常に不格好です。

シングルトンと 2 のタプルには 2 つのインスタンスがありますが、考えられるすべての次元のタプルに拡張するのは簡単です。

2 番目の質問はまだ不明です。異なる次元のタプルを生成するパーサーを生成する方法がまだわかりません。

UPD2.

ネストされたタプルを使用した最小限の実装はこちら: https://gist.github.com/voidlizard/ef67a7ae486834d591d7b45c493bec1d

基本的にはそれが欲しいのですが、実装はかなり醜いです。ネストされたタプルから離れるために、いくつかの HLists または Vinyl または何か他のものを使用して、それを改善することは可能ですか?

UPD3 と結論。

まあ、良いニュースは、すべてが可能であるということです。結果を解析するためのすべての解析関数と型またはデータ ファミリを定義する HasParser 型クラスと、Servant のクライアント関数と解析結果を type を持つものに変換する ConvertAPI 型クラスを定義して実装できます[Token] -> Manager -> BaseUrl -> ClientM a存在型にラップする必要があるa の型にはいくつかの複雑さがありますが、それでも可能です。これの実装はまだ完全ではありませんが、これは別の問題であり、型レベル プログラミングなどの最新の機能を使用して API を実装する方法です。

これを行う別の方法は、サーバントの API 定義から生成されたパーサーを使用して、値レベルで Servant.Common.Req に HTTP リクエストを構築することです。はるかに簡単ですが、多くのコードが必要であり、どういうわけか Servant の HasClient インスタンスを複製します。

率直に言って、最新の型レベルの機能を使用して API を設計するには、何らかのマニュアルが必要です。

0 投票する
1 に答える
348 参照

haskell - 永続的な `get` と `toSqlKey` の使用

0 投票する
0 に答える
579 参照

haskell - Haskell Servant: ReqBody でカスタム データ型の配列を使用する場合の 400 Bad Request

だから、私は単純な Id タイプを持っています:

そして、そのように定義されたサーバント ルート:

以下のように、ヘッダーとリクエスト本文を使用してリクエストを送信します。

しかし、次の本文で 400 が返されます (ルートはまったく入力されていません)。

github サーバント リポジトリのクローンを作成し、さまざまな部分を grep しましたが、何も見つかりませんでした。

うまく機能する他のルートがたくさんあることは、おそらく注目に値するでしょう。

おそらく私のIdタイプが適切にデコードされていないと思っていましたが (Aeson はレコードか何かを予期していました)、GHCI で問題なくボンネットの下でサーバントが行うのと同じことを使用できます:

Id タイプのカスタム JSON ハンドラーを次のように定義しても役に立ちません。

すっごく、なぜ Servant が Id の配列をデコードしようとして立ち往生し、私のルートに入るのではなく 400 をスローするのか、誰にもわかりませんか? :)

バージョン

スタック LTS 6.15、つまり:

GHC 7.10.3、サーバント 0.7.1、サーバント サーバ 0.7.1、エイソン 0.11.2.1

(servant-0.8.1もテストしましたが変化なし)

オリジナルコード

https://github.com/jsdw/talklicker/tree/master/server (ルート定義については Routes.hs を、Id の定義については Types.hs を参照)

アップデート!

したがって、問題は、正しいデータをルートに渡すことによって、サーバントが間違ったルートに一致して/entries/ordersいるように見えます (実際、「注文」を任意の文字列に置き換えることができ、末尾のスラッシュは違いはありません!)、私は実際に私の/entriesルートに到達できます。別のルート ピース (例: :> "dadada") を SetEntryOrder に追加し、それを使用して正しいルートをターゲットにすることができます。

重複する問題のルートは次のとおりです。

Routes.hs ファイルの先頭で、これらの両方に「エントリ」というプレフィックスが付いていることに注意してください。なぜこれが事実なのかはまだわかりませんが、それは始まりです!

アップデート2!

問題が解決しました!実はルートが重複していたので、私のせいです!重複するルートはほとんどすべての入力を受け入れるので、私は自分で物事を難しくしました(しかし、これを忘れていました!)。ルートを交換すると修正されました。

0 投票する
2 に答える
1020 参照

forms - サーバントで通常のフォーム投稿 (application/x-www-form-urlencoded) を処理する

Servant で通常の形式の POST を処理するにはどうすればよいですか? 特に、次のような HTML フォームを指定すると、

どうすれば物事をつなぎ合わせることができますか?