1

URLに応じて異なるアクションを実行するURLディスパッチャーを開発しようとしています。例えば:

今のところ、機能する次のコードを取得しました。

dispatch(uri) =
match uri with
  | {path= [edit] query=[("id", parameter)] ...} -> Customer.edit(parameter)
  | {path= [delete] query=[("sid", parameter)] ...} -> Customer.delete(parameter)
  | {~path ...} -> start()

server = Server.simple_dispatch(dispatch)

ただし、最初の試みでは次のことがありました。

  | {path= [edit] query=["id", parameter] ...} -> Customer.edit(parameter)
  | {path= [delete] query=[("id", parameter)] ...} -> Customer.delete(parameter)

ただし、両方の行に「id」があるため、コンパイラはエラーをスローします。明らかに、最初の行が2番目の行を「オーバーライド」しています。私の質問は次のとおりです。

  • エラーなしで両方の行に同じパラメータ名「id」を保持する方法は?
  • 異なるタイプの複数のパラメーターをどのように処理できますか? たとえば、localhost:8080/edit?id=2&ask=true&showImage=0
  • パターン「...」は何のためですか?

前もって感謝します

4

1 に答える 1

1

あなたが示したコードが実際に機能するとは思いません:)。たとえば、試してみてください:

/delete?id="xxx"
/edit?sid="xxx"

間違ったリソースがディスパッチされていることがわかります。問題は、引用符なしで配置することですedit。そのため、それらはパターン変数deleteとして扱われ、何にでも一致します (そして一致した値にバインドされます)。それがまさに、最初のバリアントが機能しなかった理由です。これらの 2 つのパターンは、変数の名前変更 (編集/削除) まで同じです。あなたが望むもの(私は思う)は:

dispatch =
| {path = ["edit"] query=[("id", parameter)] ...} -> Customer.edit(parameter)
| {path = ["delete"] query=[("id", parameter)] ...} -> Customer.delete(parameter)
| {~path ...} -> start()

複数のパラメーターを持つ方法は?

パターン マッチング (最初の行) を次のように拡張するだけです。

| {path = ["edit"] query=[("id", id), ("ask", ask), ("showImage", showImage)] ...} -> Customer.edit(id, ask, showImage)

しかし、この種のマッチングは、正確にこれらのクエリ パラメータがあり、正確にこの順序である場合にのみ機能するため、危険です。それについて確信が持てない場合は、次のことを行ってください。

| {path = ["edit"] ~query ...} ->
    id = List.assoc("id", query) ? ""
    ask = List.assoc("ask", query) ? ""
   showImage = List.assoc("showImage", query) ? ""
    Customer.edit(id, ask, showImage)

現在、順序は問題ではなく、パラメーターが欠落している場合は、デフォルト値 ( の後?) が使用されます。

パターン「...」は何のためですか?

uritype: の変数と照合しています。これには、 andUri.relative以外のフィールドがあります。は、レコードにさらにフィールドがある可能性があることを意味しますが、それらは気にしません (ドットがないと、レコードには明示的に言及されたフィールドのみがあると予想されます)。pathquery...

于 2011-12-01T11:19:26.520 に答える