2016-07-05 5 views
0

私はこれをできるだけシンプルにしようとします、それはまるで疑問のような質問かもしれません。REST:行を更新し、同じリクエストで他のリソースをゼロ個以上作成する方法は?

私は7歳のWebアプリケーション(ヘルプデスクソフトウェア)を書き直しています。異なるクライアントのWebブラウザとモバイルアプリで消費されるためには、REST APIにする必要があります。また、今のところうまく機能していたオリジナルとできるだけ近いビジネスロジックを維持することが求められます。

RESTに関する現在の闘争:私は必要なもの

は、リソースを更新することで、このリソースは、この変更のレコードを変更したのstatus_idは、両方の、保存する必要がある場合は/tickets/47321

を言うことができますall-or-nothingである必要があるため、同じDBトランザクションで使用します。これは元のアプリケーションがどのように動作したかを示しており、この動作を維持したいと考えています。

は、そこで質問です:

することができます私のtickets/47321status_idが異なる場合)、サーバーに存在するリソースを更新し、歴史変化の新しいレコードを作成するためのリソース全体または部分的な状態表現と復帰へPUT彼らは両方のバックJSONとしてクライアントへ:

{ 
    ticket: {}, // new ticket state 
    history: {} // the new created record of history change 
} 

この方法でクライアントがticketを更新し、任意のビーイングのリターンがある場合は履歴の変更のリストに歴史を追加することができますか?

+0

はい、これを行うことができます。 Javaでは、軽量なRESTフレームワークの中には、RestletsやJAX-RSなどがあり、Springは重い側で良いものです。 –

+0

通常、この動作はREST APIで発生するのですか?更新するリソース全体ではなく、 'PUT'の部分表現を送るのはどうですか? –

+0

なぜ部分表現を送信したいですか? –

答えて

0

技術的には、これは可能です。ただし、2つのオブジェクトを並べて返すだけでは簡単ではないかもしれません。 Richardson Maturity Model (Level 1)を見ると、 のAPIエンドポイント(PUT)の後に同じ種類のリソースを受け取ることが予想されます。

Hypertext Application Language(HAL)の提案のdraft仕様に従った追加のリソースを追加するか(RESTレベル3を目指す場合)チケットからの仕様(RFC 5988を)リンクのWebで定義された「ターゲットIRI」に準拠したリンク関係を、提供:

  • /api:history?ticketId=47321は、そのチケットに属するすべての履歴レコードを返す、作成日によってページングやソート、たとえば、最新のものを選択することができます。
  • あなたがから、(パッチの標準を定義する)RFC 6902を見て、これは部分更新について(そのチケットIDに関連した)最新の履歴

にまっすぐに指すように、サーバー上のいくつかの作業を行うだろう

PATCH /ticket/47321 

[ 
    { "op": "replace", "path": "/author", "value": "David"}, 
    { "op": "replace", "path": "/statusId", "value": "1"} 
] 

より多くの例がhere見つけることができるように、クライアントの視点APIを呼び出すことができます。

+0

これは良いと思われますが、 –

関連する問題