2017-09-27 18 views
1

私は、エンティティのビュー数を追跡する必要が...例えば、私はProductエンティティを持っていると、次のAPIエンドポイントを持っている:春休憩コントローラトラックエンティティビュー回数

GET /products/{productID} 

私はのビュー数を追跡したい場合特定のProduct私はこの/products/{productID}エンドポイントを呼び出すとビュー数を増やす追加ロジックを追加する必要がありますか?あるいは、この目的のために別のエンドポイントを導入すべきですか?

を更新し

は、たぶん私は私の質問に明確ではありませんでしたが、私の質問は、多層アーキテクチャについてのREST APIでカウンタを更新していない約ベストプラクティスです。私は次のように尋ねようとしています。つまり、GETリクエストでカウンタを更新するか、別のAPIを導入する必要があります。POST /products/{productID}/viewingsとし、カウンタを更新するためにGETの後に呼び出します。

+0

コントローラはWebの処理を行い、サービスはビジネスロジックを実装し、データベース(dao)はデータベースにアクセスします。 – DwB

答えて

1

またはそれがメタデータです:下記のように、あなたが同じサービスを利用することができる回数を更新するためのPOSTほぼ同じロジックを持っているので?

ビュー数がプロパティの場合は、別のPUTまたはPATCHの更新リクエストを検討してください。

GETsafe methodであり、要求されているリソースを更新しないでください。クライアントがその安全と思われる要求の結果をプリフェッチおよび/またはキャッシュすると、不正なビュー数になります。

自分自身に質問するもう1つの質問は、ビュー数がそのリソースのGET要求と同義であるかどうかということです。言い換えれば、あなたのアプリがユーザービュー以外の理由でリソース上でGETを実行する可能性があります。もしそうなら、別の非安全要求でビュー数を増やす別の理由になります。

ビューの数が実際にメタデータで、GETが実際にユーザービューと同じ場合は、先に進み、GETのカウンタを増やします。別個の要求にはコストがあり、安全要求が行われるたびにサーバ上で他に無害な副作用(例えば、ログ)が発生する可能性がある。

0

これは、AOP(Aspect Oriented Programing)にとっては良いシナリオのようです。これは、この統計ロジックとビジネスロジックを分離するためです。

AOPの詳細とSpringでそれを達成する方法については、Spring docをご覧ください。

次に、コントローラ上にポイントカットを定義し、データをカウントする(おそらくは格納する)サービスを用意することができます。

0

SpringMVCでRestControllerを使い始める方法は、クイックスタートの例です(products/{id}とJSON/XML reqメソッド、JSONはストレート/ id、XMLは/id.xmlです)。表示回数について

@RestController 
@RequestMapping("products") 
public class ProductsController { 

    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = "application/json") 
    public Product getProductInJSON(@PathVariable String id) { 

     //...Service/DAO fetch based on "id" 
     Product p = service.getProduct(id); 
     return p; 
    } 

    @RequestMapping(value = "/{id}.xml", method = RequestMethod.GET, produces = "application/xml")  
    public Product getProductInXML(@PathVariable String id) { 

     //...Service/DAO fetch based on "id" 
     Product p = service.getProduct(id); 
     return p; 

    } 
} 

、はい、私はちょうどコントローラで、余分なロジックを追加する - 迎撃よりもシンプル/きれいかもしれません。

0

コントローラまたはAOPインターセプタのいずれにもカウントを入れないでください。どちらもこの問題に対する恐ろしい解決策です。

商品(おそらくデータベース)に関する情報を提供するデータソースが必要です。 データベース(おそらくHibernateまたはMyBatisを使って書かれたDAO)にアクセスするには、JDBCラッパーを使用する必要があります。 また、(遺伝子bの回答で示されているように)特定のデータソースを取得するためにコントローラから呼び出されるサービスも必要です。

アクセス数をデータベースコード(DAO)またはサービスに入れます。

データベースに数を格納します(おそらくAccessedProductsテーブルを作成します)。

+0

あなたの答えをありがとう。おそらく、私の質問ではっきりしていないが、私の質問は、REST APIを使ってカウンターを更新するためのベストプラクティスであり、マルチレイヤーのアーキテクチャーに関するものではありません。私は以下のことを尋ねようとしています - 上記のGET要求でカウンタを更新するか、別のAPIを導入すべきです.. 'POST/products/{productID}/viewingings'とし、' GET'カウンターを更新するには? – alexanoid

1

GETサービスは値を取得するためのものであるため、理想的にはそれ以降の呼び出しである必要があります。ビューは、Productエンティティのプロパティをカウントです

 @RequestMapping(value = "/product/{id}", method = { RequestMethod.GET, RequestMethod.POST }) 
     public Product getProduct(@PathVariable String id){ 
      //get and update product 
return product; 
    } 
関連する問題