次のリストと例では、ADO.NET Data Services による PUT メソッド使用のためのプロトコルについて説明しています。「Hypertext Transfer Protocol, RFC 2616」で必要とされているその他の動作については、「一般的な HTTP 要件 (ADO.NET Data Services フレームワーク)」および「PUT、POST、および DELETE (ADO.NET Data Services フレームワーク)」で説明しています。
次のプロトコルは、PUT メソッドを使用する HTTP 要求に適用します。
正常に実行されたすべての PUT 要求は、応答コード "204 コンテンツなし" を返します。
ADO.NET Data Services リソースに対して PUT 要求を行うと、要求のコンテンツがリソースの現在の状態とマージされます。マージは、要求本文の各コンポーネントをサーバー上に存在するリソースと比較することによって行われます。
リソースにはないコンポーネントが要求本文にある場合、要求はスキーマ違反を意味し、応答コード "422 処理不可エンティティ" が返されます。
要求本文内のコンポーネントがリソース上のコンポーネントと一致する場合、要求本文内の要素の子で照合処理が続行されます。
リソースの型を null に設定できない場合に、リソースの値を null に設定する PUT 要求を行うと、応答コード "422 処理不可エンティティ" が返されます。
リソースの型で空の状態を定義していない場合に、リソースの値を空に設定する PUT 要求を行うと、応答コード "422 処理不可エンティティ" が返されます。
PUT はべき等である必要があるため、リソース セットにリソースを挿入する際に PUT を使用することはできません。つまり、PUT では POST のような追加を実装したり、セマンティクスを作成したりすることはできません。
要求ペイロード内の遅延コンテンツ注釈はすべて無視されます。
HTTP ヘッダー内の要求 URI が要求ペイロード内の関連 URI と一致しない場合、要求 URI が優先されます。ペイロードは、要求 URI の値が含まれるかのように処理されます。
PUT 要求の本文に、操作対象のリソースのキーがリソースのシリアル化の一部として含まれる場合、それらのキー値は無視されます。リソースのキー値は更新できません。
PUT メソッドをサポートする型
PUT メソッドをサポートするリソースの型の概要については、このドキュメントの後半の例で説明しています。指定のリソースに対する十分な権限が要求側の原則にない場合、PUT メソッドをサポートするリソースの型に対する PUT 要求は失敗する可能性があります。この場合、「Hypertext Transfer Protocol, RFC 2616」に記載されているように、データ サービスに別の原則を指定することにより要求を成功させることができるかどうかにより、要求に対して応答コード "401 権限がありません" または "403 アクセス不可" が返されます。
次の例は、PUT メソッドをサポートするものとサポートしないものを含む HTTP URL パス構文の終了要素を示しています。各ケースには、PUT 要求の説明および予測可能な結果が含まれます。
/<EntitySet>
最後の URI 要素の例
次の URI の例は、エンティティ セットを終了要素として示しています。
/Customers
説明 :
PUT メソッドはエンティティ セットの終了要素としてはサポートされていません。応答コード "405 サポートされていないメソッド" が返されます。
/<EntitySet>(keyPredicate)
次の URI の例は、keyPredicate を終了要素として示しています。
/Customers('ALFKI')
説明 :
PUT メソッドをサポートします。
要求本文によって提供され、keyPredicate によって指定された単一のリソースの型のインスタンスを更新します。
関連する型に対する深い更新はサポートされません。
基数 1 を持つリレーションシップの側のバインドをサポートします。
keyPredicate で指定されたリソース R1 の既存のリソースへのバインドを有効にします。
R1 に、基数 1 を持つリレーションシップの側を識別するナビゲーションまたはリンクの値として既存のリソース R2 の URI のみが含まれる場合、R1 は R2 にバインドされます。
R1 に URI とリソース本文が含まれる場合、URI は既に R1 にバインドされている既存のリソース R2 を表すものと見なされます。その後、R2 は本文で指定された値で更新されます。
R1 にナビゲーション プロパティまたはリンク プロパティの値として本文のみが含まれ、関連するリソース R2 の URI が含まれない場合は、"400 正しくない要求" が返されます。
null のリテラル値と同じペイロードをこのリソースに送信すると、応答コード "400 正しくない要求" が返されます。
リソースのキーを構成するプロパティの値は更新できません。PUT 要求のペイロードに新しい値が存在する場合、それらは無視されます。
次の URI の例は、数値キー述語を終了要素として示しています。コードは Product #123、および関連するカテゴリを更新します。そして関連付けられたカテゴリを再バインドします。
/Products(123)
JSON 形式
{
__metadata:{ uri="/Products(123)",
type="NorthwindModel.Product" },
Name:"New product name"
Category : { __metadata: {uri:"/Category(2)" } }
}
/<NavigationProperty> または /<LinkProperty>
次の URI の例は、ナビゲーション プロパティおよびリンク プロパティを終了要素として示しています。
/Customers('ALFKI')/Orders
/Customers('ALKFI')/Orders(1)
/Products(1)/Category
(これは基数 = 1 で終わるリレーションシップのみで使用できます)
説明 :
PUT メソッドをサポートします。
ナビゲーション プロパティまたはリンク プロパティが単一のリソース、または基数 1 を持つリレーションシップの最後を指定する場合 :
/<ResourceSet>(keyPredicate)
と同じセマンティクスを使用します。ただし、null 値のみを含む要求本文は、最後から 2 番目の URI セグメントによって指定されたリソースからリソースのバインドを解除します。
ナビゲーション プロパティまたはリンク プロパティが複数のリソースまたは多数のリレーションシップの最後を指定する場合 :
- サポートされていません。応答コード "405 サポートされていないメソッド" が返されます。
/<ComplexType>
次の URI の例は、複合型を終了要素として示しています。
/Customers('ALFKI')/Address
説明 :
PUT メソッドをサポートします。
要求 URI のリーフによって指定された複合型を要求本文のコンテンツで更新します。
深い更新をサポートします。
要求ペイロードには、入れ子になった複合型の更新可能なコンテンツが含まれる場合があります。そのような更新では、深さがコンテナのリソース型インスタンス内である限り、最大の深さは定義されていません。
/<Property>
次の URI の例は、プロパティを終了要素として示しています。
/Customers('ALFKI')/FirstName
説明 :
PUT メソッドをサポートします。
プロパティ値の更新をサポートしています。
プロパティは null に設定することができます。
- JSON では null プリミティブが使用されます。
/<Property>/$value
次の URI の例は、プロパティ値を終了要素として示しています。
/Customers('ALFKI')/FirstName/$value
説明 :
PUT メソッドをサポートします。
プロパティの生の値の更新をサポートしています。
値を null に設定する手段は用意されていません。
要求本文の MIME の種類は、サーバー上のリソースの種類と一致する必要があります。
プロパティの型が空の状態を定義する場合、ゼロ バイトの要求本文では、プロパティの値が空に設定されます。それ以外の場合は、応答コード "422 処理不可エンティティ" が返されます。
/<ServiceOperationName>
次の URI の例は、サービス操作名を終了要素として示しています。
/CustomersByCity?city='London'
説明 :
PUT メソッドがサポートされていません。
ADO.NET Data Services 操作用に PUT 動詞が定義されていません。
応答コード "405 サポートされていないメソッド" が返されます。
PUT 要求におけるラウンドトリップ制限
ADO.NET Data Services フレームワークでは、特定の URI で GET 要求を使用してペイロードを返すラウンドトリップ シナリオがサポートされています。よくあるシナリオとしては、一部のデータを変更し、同じペイロードをその URI 上の PUT 要求に渡すというシナリオがあります。エンティティ内のプロパティがキー列ではなく ID 列の場合、このシナリオは実行できません。唯一の解決策は、SSDL (ストア スキーマ定義言語) ファイルの ID 列を、計算されるプロパティに変更することです。
参照
概念
HttpWebRequest GET (ADO.NET Data Services フレームワーク)
HttpWebRequest PUT (ADO.NET Data Services フレームワーク)
HttpWebRequest POST (ADO.NET Data Services フレームワーク)
HttpWebRequest DELETE (ADO.NET Data Services フレームワーク)
PUT、POST、および DELETE (ADO.NET Data Services フレームワーク)