Batch リソース
このリソースは、クライアントとサーバ間の往復回数を最小限に抑えるために作成します。たとえば、モバイルアプリケーションで、ユーザがフィード項目にいいね! と言うためにボタンをタップすると、レスポンスボディにはいいね! に関する情報が含まれますが、フィード項目に対するいいね! の総数は含まれません。フィード項目にいいね! と言うには、POST で要求を /chatter/feed-elements/feedElementId/capabilities/chatter-likes/items に送信します。いいね! の合計を取得するには、GET で /chatter/feed-elements/feedElementId/capabilities/chatter-likes/items からフィード項目情報を取得します。
次のように、両方の要求を Generic Batch Collection Input リクエストボディに追加し、1 つの POST 要求で両方を /connect/batch に送信します。
1{
2 "batchRequests" : [
3 {
4 "method" : "Post",
5 "url" : "/v34.0/chatter/feed-elements/feedElementId/capabilities/chatter-likes/items"
6 },
7 {
8 "method" : "Get",
9 "url" : "/v34.0/chatter/feed-elements/feedElementId/capabilities/chatter-likes/items"
10 }
11 ],
12 "haltOnError" : "false"
13}バッチ内の各要求はサブ要求と呼ばれます。サブ要求はすべて同じユーザのコンテキスト内で実行されます。各サブ要求は独立しており、相互に情報を渡すことはできません。サブ要求は、リクエストボディ内の順序に従って実行されます。サブ要求が正常に実行されると、データがコミットされます。コミットは、以降のサブ要求の出力に反映されます (前の例のように、フィード項目にいいね! と言ってから、いいね! の総数を取得するなど)。サブ要求が失敗した場合、前のサブ要求で行われたコミットはロールバックされません。
- リソース
-
1/connect/batch - 適用開始バージョン
- 28.0
- Chatter が必要かどうか
- いいえ
- HTTP メソッド
- POST
- リクエストボディ
-
Generic Batch Collection Input
- ルート XML タグ
- <batch>
- JSON
-
1{ 2 "batchRequests" : [ 3 { 4 "method" : "Get", 5 "url" : "/v34.0/chatter/feeds/news/me" 6 }, 7 { 8 "method" : "Get", 9 "url" : "/v34.0/chatter/feeds/user-profile/me" 10 } 11 ] 12} - プロパティ
-
名前 型 説明 使用可能なバージョン batchRequests Generic Batch Input[] 実行するサブ要求の URL を含む、Batch Request Input リクエストボディのコレクション。 28.0 haltOnError Boolean デフォルト値は、false です。 値が false で、バッチ内のサブ要求が完了しない場合、Salesforce は、バッチ内の後続のサブ要求を実行しようと試みます。
値が true で、HTTP 応答 400 番台または 500 番台のエラーが含まれるためにバッチ内のサブ要求が完了しない場合、Salesforce は実行を停止します。バッチ内にある後続のサブ要求の実行は試みず、後続のサブ要求ごとに HTTP 412 状況コードと前の要求が失敗したことを示す BATCH_PROCESSING_HALTED エラーメッセージを返します。/connect/batch への最上位要求は、HTTP 200 を返し、応答内の hasErrors プロパティが true に設定されます。
28.0
- 要求パラメータ
- なし。
- 応答
- Batch Results
- 例
- この単純な例では、https://instance_name/services/data/v34.0/connect/batch に対する POST 要求に、2 つのサブ要求を持つ次のリクエストボディが含まれています。
1swfobject.registerObject("clippy.codeblock-3", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17{ 18 "batchRequests" : [ 19 { 20 "method" : "Get", 21 "url" : "/v34.0/chatter/feeds/user-profile/me" 22 }, 23 { 24 "method" : "Get", 25 "url" : "/v34.0/chatter/feeds/news/me" 26 } 27 ] 28}Batch Results レスポンスボディには、サブ要求ごとに Batch Result Item レスポンスボディが含まれます。1swfobject.registerObject("clippy.codeblock-4", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17{ 18 "hasErrors": false, 19 "results": [ 20 { 21 "result": { 22 "feedElementPostUrl": "/services/data/v34.0/chatter/feed-elements", 23 "feedElementsUrl": "/services/data/v34.0/chatter/feeds 24/user-profile/005D0000001LL8OIAW/feed-elements", 25 "isModifiedUrl": null 26 }, 27 "statusCode": 200 28 }, 29 { 30 "result": { 31 "feedElementPostUrl": "/services/data/v34.0/chatter/feed-elements", 32 "feedElementsUrl": "/services/data/v34.0/chatter/feeds 33/news/005D0000001LL8OIAW/feed-elements", 34 "isModifiedUrl": null 35 }, 36 "statusCode": 200 37 } 38 ] 39} - 例: haltOnError が true の場合
- これは前と同じ例ですが、最初のサブ要求にエラーが含まれ、haltOnError が true に設定されています。最初のサブ要求には入力ミスがあります。
1swfobject.registerObject("clippy.codeblock-5", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17{ 18 "batchRequests" : [ 19 { 20 "method" : "Get", 21 "url" : "/v34.0/chatter/feeds/user-profile/men" 22 }, 23 { 24 "method" : "Get", 25 "url" : "/v34.0/chatter/feeds/news/me" 26 } 27 ], 28 "haltOnError" : "true" 29}Batch Results レスポンスボディには、サブ要求ごとに Batch Result Item レスポンスボディが含まれます。/connect/batch への最上位要求は HTTP 200 を返しますが、最初のサブ要求はリソースが見つからないため HTTP 404 を返します。haltOnError が true であるため、次のサブ要求は HTTP 412 を返します。また、hasErrors は true に設定されています。1swfobject.registerObject("clippy.codeblock-6", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17{ 18 "hasErrors": true, 19 "results": [ 20 { 21 "result": [{ 22 "errorCode": "NOT_FOUND", 23 "message": "The requested resource does not exist" 24 }], 25 "statusCode": 404 26 }, 27 { 28 "result": [{ 29 "errorCode": "BATCH_PROCESSING_HALTED", 30 "message": "Batch processing halted per request" 31 }], 32 "statusCode": 412 33 } 34 ] 35} - バイナリファイルを含む複数のコメントの投稿
- この例は、2 つのサブ要求が含まれる https://instance_name/services/data/v34.0/connect/batch への汎用バッチ要求です。各サブ要求はフィード項目にコメントし、バイナリファイルをコメントにアップロードします。
- richInput プロパティには、各サブ要求のリクエストボディを含める必要があります。
- また、binaryPartName および binaryPartNameAlias プロパティには、バイナリパートに関する情報を含める必要もあります。
- 次に cURL の例を示します。
1curl -H "X-PrettyPrint: 1" -F 'json={ "haltOnError":true, "batchRequests":[ { "url":"/v33.0/chatter/feed-elements/0D5D0000000YG0N/capabilities/comments/items", 2"method":"Post", "binaryPartName":"binaryPart1", "binaryPartNameAlias":"feedElementFileUpload", "richInput":{ "body":{ "messageSegments":[ { "type":"Text", "text":"Check out this file, it may help." } ] }, 3 "capabilities":{ "content":{ "title":"Presentation1.txt" } } } }, { "url":"/v33.0/chatter/feed-elements/0D5D0000000YG0M/capabilities/comments/items", 4"method":"Post", "binaryPartName":"binaryPart2", "binaryPartNameAlias":"feedElementFileUpload", "richInput":{ "body":{ "messageSegments":[ { "type":"Text", "text":"Check out this file, it may help." } ] }, 5 "capabilities":{ "content":{ "title":"Presentation2.txt" } } } } ] };type=application/json' -F "binaryPart1=@/Users/jbleyle/Desktop/Presentation1.txt;type=application/octet-stream" 6-F "binaryPart2=@/Users/jbleyle/Desktop/Presentation2.txt;type=application/octet-stream" 7-X POST https://instance_name/services/data/v34.0/connect/batch 8-H 'Authorization: OAuth 00DD00000007HoR!...' --insecure - これは、マルチパート/フォームデータリクエストボディです。
1swfobject.registerObject("clippy.codeblock-8", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17https://instance_name/services/data/v34.0/connect/batch 18 19Authorization: OAuth 00DD0000000Jhd2!... 20Accept: application/json 21Host: instance_name 22Content-Type: multipart/form-data; boundary=123123 23 24--123123 25Content-Disposition: form-data; name="json" 26Content-Type: application/json 27 28{ 29 "haltOnError":true, 30 "batchRequests":[ 31 { 32 "url":"/v34.0/chatter/feed-elements/0D5D0000000YG0D/capabilities/comments/items", 33 "method":"Post", 34 "binaryPartName":"binaryPart1", 35 "binaryPartNameAlias":"feedElementFileUpload", 36 "richInput":{ 37 "body":{ 38 "messageSegments":[ 39 { 40 "type":"Text", 41 "text":"Check out this file, it may help." 42 } 43 ] 44 }, 45 "capabilities":{ 46 "content":{ 47 "title":"Presentation1.txt" 48 } 49 } 50 } 51 }, 52 { 53 "url":"/v34.0/chatter/feed-elements/0D5D0000000YG0H/capabilities/comments/items", 54 "method":"Post", 55 "binaryPartName":"binaryPart2", 56 "binaryPartNameAlias":"feedElementFileUpload", 57 "richInput":{ 58 "body":{ 59 "messageSegments":[ 60 { 61 "type":"Text", 62 "text":"Check out this file, it may help." 63 } 64 ] 65 }, 66 "capabilities":{ 67 "content":{ 68 "title":"Presentation2.txt" 69 } 70 } 71 } 72 } 73 ] 74} 75 76 77--123123 78Content-Disposition: form-data; name="binaryPart1"; filename="Presentation1.txt" 79Content-Type: application/octet-stream; charset=ISO-8859-1 80Content-Transfer-Encoding: binary 81 82This is the content of file 1 83--123123 84Content-Disposition: form-data; name="binaryPart2"; filename="Presentation2.txt" 85Content-Type: application/octet-stream; charset=ISO-8859-1 86Content-Transfer-Encoding: binary 87 88This is the content of file 2 89--123123-- 90