在组织服务中有executemultiple来执行批处理,那web api是否有批处理呢?答案是有的。
批处理的请求url很简单[Organization URI]/api/data/v8.2/$batch,在最后加个$batch就行,但body非常的难拼,换行空格大小写,幺蛾子很多,本篇分别分享下js中的body拼写和C#中的body拼写,着重介绍下我在拼的过程中遇到的幺蛾子。
先上js的body,这里我放了一个post的新建和一个patch的更新
var data = [];
data.push('--batch_123456');
data.push('Content-Type: multipart/mixed;boundary=changeset_BBB456');
data.push('');
data.push('--changeset_BBB456');
data.push('Content-Type:application/http');
data.push('Content-Transfer-Encoding:binary');
data.push('Content-ID:1');
data.push('');
data.push('POST ' + Xrm.Page.context.getClientUrl() + '/api/data/v8.2/accounts HTTP/1.1');
data.push('Content-Type:application/json;type=entry');
data.push('');
data.push('{ "name": "batch acount 20"}');
data.push('--changeset_BBB456');
data.push('Content-Type:application/http');
data.push('Content-Transfer-Encoding:binary');
data.push('Content-ID:2');
data.push('');
data.push('PATCH ' + Xrm.Page.context.getClientUrl() + '/api/data/v8.2/accounts(760C2F6D-276D-E811-80DC-0017FA01322A)' + ' HTTP/1.1');
data.push('Content-Type:application/json;type=entry');
data.push('');
data.push('{ "telephone1": "13223874637"}');
data.push('--changeset_BBB456--');
data.push('--batch_123456--');
var payload = data.join('\r\n');
此处的--batch_123456,下划线后面的123456是随机定义的,只要前后对应即可,--changeset_BBB456,这里的下划线后面的BB456也是一样随机的,只要前后对应即可,最要注意的是空行
下面的是断点跟踪取到的body的内容,和SDK sample中的body体,如果拼的过程中遇到错误就严格对照sample的body格式
"--batch_123456
Content-Type: multipart/mixed;boundary=changeset_BBB456
--changeset_BBB456
Content-Type:application/http
Content-Transfer-Encoding:binary
Content-ID:1
POST http://139.219.130.107:5555/YunHai/api/data/v8.2/accounts HTTP/1.1
Content-Type:application/json;type=entry
{ "name": "batch acount 20"}
--changeset_BBB456
Content-Type:application/http
Content-Transfer-Encoding:binary
Content-ID:2
PATCH http://139.219.130.107:5555/YunHai/api/data/v8.2/accounts(760C2F6D-276D-E811-80DC-0017FA01322A) HTTP/1.1
Content-Type:application/json;type=entry
{ "telephone1": "13223874637"}
--changeset_BBB456--
--batch_123456--"
注意HTTP method要全部大写,比如我写成patch就不对
再附上C#中的body体,这里注意每行body后面的\n换行符,以及该换行的地方要另加换行符\n
var body = "--batch_webapifetch\n";
body += "Content-Type:multipart/mixed;boundary=changeset_BBB456\n";
body += "\n";
body += "--changeset_BBB456\n";
body += "Content-Type:application/http\n";
body += "Content-Transfer-Encoding: binary\n";
body += "Content-ID:1\n";
body += "\n";
body += "POST http://139.219.130.107:5555/yunhai/api/data/v8.2/accounts HTTP/1.1\n";
body += "Content-Type: application/json\n";
body += "OData-Version: 4.0\n";
body += "OData-MaxVersion: 4.0\n";
body += "\n";
body += "{\"name\": \"batch acount 200\"}\n";
body += "--changeset_BBB456\n";
body += "Content-Type:application/http\n";
body += "Content-Transfer-Encoding: binary\n";
body += "Content-ID:2\n";
body += "\n";
body += "PATCH http://139.219.130.107:5555/yunhai/api/data/v8.2/accounts(760C2F6D-276D-E811-80DC-0017FA01322A) HTTP/1.1\n";
body += "Content-Type: application/json\n";
body += "OData-Version: 4.0\n";
body += "OData-MaxVersion: 4.0\n";
body += "\n";
body += "{\"telephone1\": \"18621384365\"}\n";
body += "--changeset_BBB456--\n";
body += "--batch_webapifetch--";
再重点强调下格式,比如我以为url后面的HTTP/1.1应该是个无伤大雅的东西吧就不加了,结果就是400,加上后就对了,
按官方文档的说法Batch requests包含的request上限是100,然后返回的batchresponse是下面这样的,是一个文本而非一个json对象,所以response的处理上需要你自己写个什么处理方法了。
"--batchresponse_0a42cdd6-f6d4-4cce-b509-ed73c74bff23
Content-Type: multipart/mixed; boundary=changesetresponse_79ef0f48-d5e1-4090-81b8-d89a32f64bdc
--changesetresponse_79ef0f48-d5e1-4090-81b8-d89a32f64bdc
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 1
HTTP/1.1 204 No Content
OData-Version: 4.0
Location: http://139.219.130.107:5555/YunHai/api/data/v8.2/accounts(906fe6d6-3e6d-e811-80dc-0017fa01322a)
OData-EntityId: http://139.219.130.107:5555/YunHai/api/data/v8.2/accounts(906fe6d6-3e6d-e811-80dc-0017fa01322a)
Access-Control-Expose-Headers: Preference-Applied,OData-EntityId,Location,ETag,OData-Version,Content-Encoding,Transfer-Encoding,Content-Length,Retry-After
--changesetresponse_79ef0f48-d5e1-4090-81b8-d89a32f64bdc
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 2
HTTP/1.1 204 No Content
OData-Version: 4.0
Location: http://139.219.130.107:5555/YunHai/api/data/v8.2/accounts(760C2F6D-276D-E811-80DC-0017FA01322A)
OData-EntityId: http://139.219.130.107:5555/YunHai/api/data/v8.2/accounts(760C2F6D-276D-E811-80DC-0017FA01322A)
Access-Control-Expose-Headers: Preference-Applied,OData-EntityId,Location,ETag,OData-Version,Content-Encoding,Transfer-Encoding,Content-Length,Retry-After
--changesetresponse_79ef0f48-d5e1-4090-81b8-d89a32f64bdc--
--batchresponse_0a42cdd6-f6d4-4cce-b509-ed73c74bff23--
"