2009-05-16 10 views
6

私が正しく理解していれば、すべてのクエリ(つまり、リソースの状態を変更しないすべてのリソースのすべてのアクション)は、getメソッドを使ってクエリ文字列にエンコードする必要があります。RESTで複雑なクエリを渡すには?

私は正しいですか?

私は、Visual Basic 6コンポーネントで処理されるXMLメッセージを介してdbと通信するいくつかのアプリケーションを用意しています。

クエリのメッセージは、今我々はXMLメッセージを再設計する過程にあるこの

<xml> 
    <service>account</service> 
    <resource>invoice</resource> 
    <action>query</action> 
    <parameters> 
    <page>1</page> 
    <page_len>10</page_len> 
    <order>date</order> 
    <fields>*</fields> 
    <conditions> 
     <date>2009-01-01..2009-01-31</date> 
     <customer_id>24</customer_id> 
    </conditions> 
    </parameters> 
</xml> 

のようなものであり、我々は、彼らが簡単になる可能性があるようにということをやってみたいですRESTfulインターフェイスにマップされます。

上記の例では、パラメータと条件の衝突を防ぐために "条件"タグが必要です(つまり、 "order"、 "page"などの名前のフィールドがあるとどうなりますか)。 、接頭辞パラメータを送信

http://account/invoice/?_page=1&_page_len=10&_order=date&_fields=*&date=2009-01-01..2009-01-31&customer_id=24 

のようなものとXMLは、我々

[...] 
    <_order>date</_order> 
    <_fields>*</_fields> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
[...] 

ようなものになるだろう。..について

我々は、しかしクラッシュ操作のためのいくつかの本当に単純なXMLフォーマットを定義しようとしており、結果のXMLをrestやJSONに簡単にマッピングできるようになりました。

どのように残りのアプリケーションでこの種のクエリをマップしますか?いくつかの標準が定義されていますか?またはcrud rest/XML/JSONサンプルを含むいくつかのページ?エラーを返したり、ネストしたデータセットを返すのはどうですか?

ありがとうございます。

答えて

6

IMHO本当にあなたのシステムを本当にRESTfulにするには、送信するすべてのメッセージ/クエリを再考する必要があります。

この部分:

<conditions> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
</conditions> 

はトリッキーな部分です。どんな他の条件がありますか?そこにはたくさんいる?この特定の例では、請求書を顧客のサブリソースとして扱うことができると私は考えています。私が休んだら、私はいつもパス内のリソースを特定しようとします。そして、クエリがパラメータを必要とする場合、それらをクエリ文字列に移動します。だから私はこのようなものを書くだろう:

GET /customers/24/invoices?start_date=2009-01-01&end_date=2009-01-31 

あなたのリソース間の関係について考えてみてください。たとえば、リソースタイプFooに関連するリソースタイプバーが多対多の関係にあるとします。この場合、この関係について次のように問い合わせることができます:GET /foo/123/barとそれをフィルタリングするためにクエリ文字列パラメータを追加します。この問題は、他のリソースとの関係を含む方法でフィルタリングしたいときに始まります。 IMHOこれは、リソース設計が本当にRESTfulではないことを意味します。

0

xmlを渡すためにはurl-encodeする必要がありますが、xmlをjsonに変換した場合は、その文字列を渡してjson-> xmlまたはjson-> objectを渡して処理できます。これにより、より複雑なオブジェクトを渡すことができます。

完璧ではありませんが、機能します。 :)

+0

私はあなたのアプローチを理解していますが、私はqueryStringに自分のXMLを詰め込むのではなく、どのように残りの原則に従うことにしたいのですか? – opensas

+0

それは言及したように、データを送信する必要がありますが、データをデータベースに送信するだけの場合は、URLで送信できるようにエンコードすることが理にかなっています。 GETを使用している場合は、別の方法があります。 –