この質問をすると、Stackoverflowでこの投稿を見つけることができます。さまざまなアプローチの長所と短所が詳細に検討されています。
この記事では、著者はWebmachineを使用してWebリソースを作成するトピックを拡張しようとしました。
それでは、Webmachineとは何ですか? 開発者自身によると、明確な答えはありません。Webフレームワークであるか、RESTのようなWebリソースを作成するためのツールです。 著者は、これは提供されたツールを使用してWebサービスの状態を記述する方法であると考えています。
Webmachineの何が面白いですか?
dispatch.conf
Webmachineの重要な機能は、要求がその宛先に到達する方法です。 dispatch.confファイルがあります。このファイルには、リクエストのアドレスを処理するモジュールに一致させるためのルールが定義されています。 このモジュールは、Webmachineの用語ではリソースと呼ばれます。
球状のdispatch.confの例:
%%-*- mode: erlang -*- 
      
        
        
        
      
     {["page1", "subpage11"], page11_resource, []}. 
      
        
        
        
      
     {["page1", "subpage12"], page12_resource, [{is_protected, true}]}. 
      
        
        
        
      
     {["page2", '*'], page2_resource, []}. 
      
        
        
        
      
     {['*'], default_resource, []}. 
      
        
        
        
      
    
      
      この例は、このファイルの各行が3つの部分で構成されていることを示しています。 最初の部分は、現在のリクエストが処理されるルールです。 要求がこれらのルールの1つを満たすとすぐに、現在の行の2番目の部分に記述されているリソースに送信されます。 最後の部分は、このリソースのinit関数の入力パラメーターです。
たとえば、Webmachineが
localhost:8000
      
      で実行されている場合、
localhost:8000/page1/subpage12
      
      は2番目のルールに該当し、
localhost:8000/unknown_url/subpage42
      
      最後に処理されます。
フロー図
Webmachineと他のほとんどの技術のもう1つの重要な違いは、リソース内のリクエストを処理するプロセスを次の図に示すレベルに分類することです。
      この図の各ノードには、さらに進むか停止するかを決定するハンドラー関数があります。 ほとんどのノードには、妥当なデフォルトのハンドラーが提供されているため、タスクは、目的に不可欠なノードの決定とそのロジックの実装に限定されます。
球状リソースの例:
-module(page12_resource). 
      
        
        
        
      
     -export([init/1, is_authorized/2, content_types_provided/2, allowed_methods/2, to_html/2, to_text/2]). 
      
        
        
        
      
     
      
        
        
        
      
     -include_lib("webmachine/include/webmachine.hrl"). 
      
        
        
        
      
     
      
        
        
        
      
     init(InitArgsFromDispatchConf) -> {ok, InitArgsFromDispatchConf}. 
      
        
        
        
      
     
      
        
        
        
      
     content_types_provided(Request, Context) -> 
      
        
        
        
      
     {[{"text/html", to_html},{"text/plain",to_text}], Request, Context}. 
      
        
        
        
      
     
      
        
        
        
      
     allowed_methods(Request, Context) -> 
      
        
        
        
      
     {['GET', 'POST'], Request, Context}. 
      
        
        
        
      
     
      
        
        
        
      
     is_authorized(Request, Context) -> 
      
        
        
        
      
     case wrq:get_req_header("Authorization", ReqData) of 
      
        
        
        
      
     "Basic "++Base64 -> 
      
        
        
        
      
     Str = base64:mime_decode_to_string(Base64), 
      
        
        
        
      
     case string:tokens(Str, ":") of 
      
        
        
        
      
     ["authdemo", "demo1"] -> 
      
        
        
        
      
     {true, Request, Context}; 
      
        
        
        
      
     _ -> 
      
        
        
        
      
     {"Basic realm=webmachine", Request, Context} 
      
        
        
        
      
     end; 
      
        
        
        
      
     _ -> 
      
        
        
        
      
     case proplists:get_value(is_protected, Context, false) of 
      
        
        
        
      
     false -> {true, Request, Context}; 
      
        
        
        
      
     _ -> {"Basic realm=webmachine", Request, Context} 
      
        
        
        
      
     end 
      
        
        
        
      
     end. 
      
        
        
        
      
     
      
        
        
        
      
     to_html(Request, Context) -> {"Hello, html world", Request, Context}. 
      
        
        
        
      
     
      
        
        
        
      
     to_text(Request, Context) -> {"Hello, text world", Request, Context}. 
      
        
        
        
      
    
      
      この例は、リソースが「text / plain」と「text / html」の両方でデータを出力できることを示しています。 要求ヘッダーで「Accept:text / xml」を設定した場合、このリソースにアクセスすると、サーバーからの応答で「HTTP / 1.1 406 Not Acceptable」を受け取ります。 同様に、リクエストメソッドの場合、「PUT」または「DELETE」を実行しようとすると、応答で「HTTP / 1.1 405 Method Not Allowed」が返されます。 基本認証の簡単な例も提供されています。
統合Webデバッガー
アプリケーションのデバッグメカニズムは非常に便利です。 これは、同じWebマシン上で実行されるWebリソースであり、アクセスされると、ダイアグラム上にリクエストのトレースパス全体とすべての中間状態を表示します。 デバッガーの例はここにあります 。
パターン
テンプレートとテンプレートエンジンのファンは、非常に機能的なDjango Templates Language- ErlyDtlのポートを使用できます。
入手先
Webmachineを使い始めるのは非常に簡単です。
 git clone github.com/basho/webmachine.git 
      
        
        
        
      
     cd webmachine && ./scripts/new_webmachine.sh mydemo ~/webmachine_applications 
      
        
        
        
      
     cd ~/webmachine_applications/mydemo && make && ./start.sh 
      
        
        
        
      
    
      
      WikiまたはGithubの詳細なドキュメント。
ソースコードには、 鉄筋ビルドユーティリティとstart.shスタートアップスクリプトが含まれています。
privフォルダーにはdispatch.confがあり、 srcフォルダーにはリソースのソースコードがあります。
おわりに
Webmachineは、ErlangでWebアプリケーションを構築するための柔軟で強力なプラットフォームです。 それは非常に単純ですが、原始的、普遍的ではありませんが、包括的ではありません。 これは、RESTのようなサービス開発者とWeb開発者の注目に値する興味深い技術です。
PS Webmachineの機能に何か不足している場合は、下のレベルに移動して、クジラ(Mochiweb)を選択できます。
お茶を飲んで、アーランを書きます。