Dynamics 365 Web API 批处理(batch requests)

   在组织服务中有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--
"

猜你喜欢

转载自blog.csdn.net/woniu1104913/article/details/80653614
今日推荐