2017-10-17 4 views
0

私はnode.jsを初めて使用しており、最初のnode.jsが安いAPIをhapi.jsフレームワークで構築しています。すべてのサービスは基本的にデータベースクエリを実行しています。サービスの例は、このようなものです:あなたは、サービスが呼び出されたときに、見ることができるように安心なAPIを構築するときに選択するHTTPメソッド

let myservice = { 
    method: "POST", 
    path: "/updateRule", 
    config: { 
     handler: (request, reply) => { 
      updateRule(request.payload) 
      .then((result) => { 
       reply(successResponse(request, result)); 
      }) 
      .catch((err) => reply(failResponse(request, err)).code(500)); 
     }, 
     validate: { 
      payload: { 
       ruleId: joi.number().required(), 
       ruleName: joi.string().required(), 
       ruleDesc: joi.string().required() 
      } 
     }, 
     auth: "jwt", 
     tags: ["api", "a3i"] 
    }, 
} 

updateRule(input): Promise<any> { 
     return new Promise((resolve, reject) => { 
      let query = `select a3i.update_rule(p_rul_id := ${input.ruleId}, p_rul_name := '${input.ruleName}', p_rul_desc := '${input.ruleDesc}')`; 
      postgresQuery(lbPostgres, query, (data, commit, rollback) => { 
       try { 
        let count = data.rows[0].update_rule.count; 
        if (count === 1) { 
         let ruleId = data.rows[0].update_rule.result[0]; 
         let payload: SuccessPayload = { 
          type: "string", 
          content: `Rule ${ruleId} has been updated` 
         }; 
         commit(); 
         resolve(payload); 
        } else { 
         let thisErr = new Error("No rule can be found."); 
         thisErr.name = "4003"; 
         throw thisErr; 
        } 
       } 
       catch (err) { 
        rollback(); 
        if (err.name === "4003") { 
         reject(detailError(4003, err.message)); 
        } else { 
         reject(detailError(4001, err.message)); 
        } 
       } 
      }, reject); 
     }); 
    } 

、それはデータベースコール(クエリ)を連想させると更新は、データベーステーブル内の行を指定しました。同様に、createRule/deleteRuleという名前の他のサービスもデータベーステーブル内にレコードを作成/削除しています。 私の意見では、サービスの違いは、異なるデータベースクエリを実行しています。私はこのポストPUT vs. POST in RESTを読んだが、私のケースではPOSTとPUTの違いは見えなかった。

ここに私の質問は以下のとおりです。

  1. が、私はこのケースではどのようなHTTPメソッドを使用する必要がありますか?

  2. 多くの安らかなAPIの例(たとえばhttps://www.codementor.io/olatundegaruba/nodejs-restful-apis-in-10-minutes-q0sgsfhbd)は、同じHTTPで同じURLを使用して、同じ「リソース」に対して異なる操作を実行します。これは通常、データベース表です。このアーキテクチャの利点は、1つのURLだけが1つのHTTPメソッドを持ち、1つのタイプの操作しか行わないという私の習慣と比べて何ですか?

私はこの問題が問題ではなく、具体的ではないことを知っています。一部の人々はそれを下投票するかもしれません。しかし、初心者としては、どのような典型的なRestful APIがあるかを知りたいし、APIが「ベストプラクティス」であることを確認したいと思っています。助けてください!

答えて

2

リソースが既に存在し、そのリソースに固有のURIがあり、それを更新する場合は、PUTを使用します。

リソースがまだ存在しない場合に、リソースを作成して、その新しいリソースを表すURIを選択させる場合はPOSTを使用し、POST URIは一般的な「新しいリソースの作成」URIになります。特定のリソースへのURIではなく、そのリソースを表すURIを作成します。

呼び出し元が新しいリソースを表すリソースURIを作成する場合は、PUTを使用して新しいリソースを作成することもできます。その場合、その新しいリソースにPUTすれば、そのURIを持つリソースがすでに存在する場合はそれが更新され、存在しない場合は作成されます。

両方をサポートする必要はありません。あなたは、どちらか一方だけを使用する方法であなたのAPIを動作させることを決定することができます。あなたの特定の場合、すでにそれはまだあなたがその行を表し、特定のURIにPUTをやっている存在するため、ほとんど常に置かれる存在するデータベース内の特定の行の更新で


このアーキテクチャの利点は、1つのURLが1つのHTTPメソッドしか持たず、1つのタイプの操作しかしないという私の習慣と比べて何ですか?

あなたのAPIをどのように表示するかはあなた次第です。、いくつかのケースでは

resource identifier 
data 
method 

、メソッドがGETで包含することができ、PUT、POSTとPUTやDELETEので、あなただけのリソース識別子、データを必要とGET:RESTの背後にある一般的な概念は、あなたがいくつかのコンポーネントを持っているということですPOSTまたはDELETE。

他のケースや他のデザインでは、PUTやPOSTだけで表現できる方法よりも詳細なので、URLに実際にメソッドがある場合は、PUTとPOSTの区別が必要ない場合がありますできるだけ多く。

たとえば、アクションが「購入」である可能性があります。そのメソッドがURLの残りの部分に暗示されているPOSTでキャプチャすることができますが、実際にはそのメソッドを持つURLにPOSTすることができます:/buy明瞭にするために、同じエンドポイント接頭辞を他のメソッドは/addToCartなどです。実際には、オブジェクトがRESTデザイン内にどのような操作をしていて、それらの上に表示するかによって異なります。場合によっては、オブジェクトはGET、PUT、POST、DELETEだけに適していることがあります。また、そのリソースで実行される特定の操作についての詳細情報が必要な場合もあります。

+0

サービスパスにパラメータを追加する必要があるため、すべてのリソース(データベーステーブルの行)に対応するURLがあるようです。たとえば、レコードに対して操作を実行する場合は、URL内のパラメータとして一意のIDを渡す必要があります。これは正しいですか? – zhangjinzhou

+0

@zhangjinzhou - これはRESTfulな方法でしょう。 GET、PUT、またはDELETEの各URIは、固有のリソースを表す必要があります。 – jfriend00

+0

はい、正しいです。これはURLのオプションパラメータとして定義されています。 – Silencer310

1

レストに準拠したい場合は、PostGetを使用できます。 >ポスト

  • 読む - - >
  • 更新ゲット - >置きまたはパッチ
  • を削除 - >削除]あなたはRestfullになりたい場合は

    • 作成 、あなたはCRUDにあなたの方法をベースにする必要があります

    完全なAPIを構築することについては、同じURL上のメソッドを使用することで構築/理解が容易になる可能性があります。 userに関するすべてのクエリはuser/getuser/adduser/updateではなく、userのURLになります。これにより、URLがあまり大きくなくても同じ機能を利用できます。

    APIをビルドするときには、統計分析などのためにいくつかのログが必要です。この方法では、あなたのメソッドで分割した場合、いくつの投稿要求またはGet要求の数を記録するフィルタを持つことができます。

    実際、GetリクエストでのみAPIを構築することもできます。しかし、メソッドとURLとsplitingは(あまりにも多くのアクション名を持つまたはURL)錯体のURLを避けるために、あなたのAPIを経由するすべての要求をログに記録する最も簡単な方法を持っていることが最善の方法です

    enter image description here - リスト項目

    • レベル1がレストある

    • レベル2 Restfull

    • レベル3

    • HATEOASであります

    あなたは私が通常行うことは、新しいリソースを作成するための「POST」を使用し、既存のリソースを更新するための「PUT」を使用しているMartin Fowler氏

  • +0

    あなたの投稿をありがとう。さまざまなレベルが非常に役立ちます!ファイルをアップロードしたり、ストリームなどを渡したりする場合があるため、通常はAPIを構築するにはGETで十分ではないことを理解しています。しかし、POST/PUTを使用してリソースを作成/更新する場合、私は何の違いも見ません。 – zhangjinzhou

    +0

    識別子を指定せずにPOSTを使用するのと同じように、PUTを使用して新しいリソースを作成することはできませんか? – zhangjinzhou

    +0

    はい、このように置くことができます – sheplu

    0

    によって書かれたいくつかの書籍や記事内のより多くの情報を見つける必要があります。

    2番目の質問では、大部分のAPIは同じURLを使用して、同じリソース上でさまざまなことを行います。これは、あなたがあなたのURLに行っていること(例えば、/ delete)を公開したくないセキュリティのためかもしれません。また、多くのフレームワークではリソース(オブジェクトクラス)の自動URLが生成され、要求メソッドで区別されます。人々はそれらのためにカスタムURLを使用する傾向がありません。

    関連する問題