利用Fiddler修改请求信息通过Web API执行Dynamics 365操作(Action)实例
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。
Web API在Dynamics CRM中的功能越来越强大,Dynamics 365 (Dynamics CRM V8.2) 又增加了一些通过通过Web API可以执行的操作(Action) ,比如 ExecuteWorkflow这个Action,具体Web API可以执行哪些操作呢?可以参考SDK的 Web API Action Reference 章节,也有在线版本,在线版本是 Web API Action Reference 。当然,这个章节的内容会变化,要查看Dynamics CRM对应版本的SDK。今天要讲解的是利用Fiddler的Replay功能通过Web API调用操作。
在继续阅读之前,如果你对通过Web API执行操作没有概念,强烈建议你先阅读我的文章:Dynamics CRM 2015/2016新特性之二十四:使用Web API执行操作 。
我们先看 ExecuteWorkflow Action 的说明,可以知道它是一个绑定操作, 它有一个输入参数 EntityId ,也有返回参数,是个asyncoperation 实体记录类型。为了测试需要,先要找一个工作流,我这里有一个工作流如下,我这里故意没有选中 作为按需流程 ,是因为我想看看不选中这个是否也可以通过代码执行这个工作流,当然在界面上通过运行工作流此时是找不到这个工作流的。

然后我需要找一条这个工作流对应实体的一条记录,我这里选择一条记录。顺便介绍下如何获取记录ID的方法,右击一条记录,选择 在新窗口中打开 。

然后就会在新窗口中打开,可以看到打开记录时候的URL是类似: https://demo.luoyong.me/main.aspx?etc=10007&extraqs=&histKey=789763582&id=%7bB907DE1B-CF99-E611-8161-000D3A80C8B8%7d&newWindow=true&pagetype=entityrecord&sitemappath=SFA%7cExtensions%7cly_test#348434379 。这个URL中的id=%7b 和 %7d之间的就是这个记录的ID。
我们还需要执行的工作流的ID,在解决方案中双击打开该工作流,有类似这样的URL:https://demo.luoyong.me/sfa/workflow/edit.aspx?_CreateFromId=%7b2721DA92-65A4-E511-80CB-000D3A80CE7F%7d&_CreateFromType=7100&appSolutionId=%7b2721DA92-65A4-E511-80CB-000D3A80CE7F%7d&id=%7b6BEBC426-F722-4B64-AE5D-0DA379F8A8C4%7d
同样的我们可以拿到这个工作流的ID。
我这里借助Fiddler来Replay,启用Fiddler抓包,右击一个请求,选择 Replay > Reissue from Composer.

在Fiddler的Composer中打开页面类似如下:

然后我们就可以更改请求方法,请求URL,请求头Header和请求体Body。我这里更改如下:
POST的URL我改成了:https://demo.luoyong.me/api/data/v8.2/workflows(6BEBC426-F722-4B64-AE5D-0DA379F8A8C4)/Microsoft.Dynamics.CRM.ExecuteWorkflow
Request Body我改成了如下,特别注意这个Cookie的元素值要保留,用来认证的,当然也会过期:
Content-Type: application/json; charset=utf-8
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Cookie: ReqClientId=dff59da0-52dd-42f9-8ab9-e62ad9b24e57; e9cd027f-26a3-e511-80c6-000d3a807ec7_bd2a5c49-6b08-4eda-8a15-84159d9fd349=/Date(1478082706255)/; persistentNavTourCookie=HideNavTour; CRM_MSG_BAR_ServiceDeskAlert%23e9cd027f-26a3-e511-80c6-000d3a807ec7=HideMessage; MSISAuth=77u/PD94bWwgdmVyc2lvbj0iMSlSNWN6UEdTQm9Md0FnQUFFWU8ydHhxQXNxTVo0NS83WUJRL3pGdk1ZWndQWld6RnhjcVhHYWx6ZjZscFVsUVBnVWprSnArVVZYY0IxcGNsMXF5VmZ0UVm5nVnFSc3pxV1RKbjlrMWxlRWhB; MSISAuth1=M3VIZmdZZmVF0eUNvbnRleHRUb2tlbj4=; CRM_MSG_BAR_e9cd027f-26a3-e511-80c6-000d3a807ec7GetAppsForCrm=HideMessage; CRM_MSG_BAR_EnableS2SAlert%23e9cd027f-26a3-e511-80c6-000d3a807ec7=HideMessage
Request Body我改成了:
{"EntityId":"B907DE1B-CF99-E611-8161-000D3A80C8B8"}
我执行的话会返回HTTP Status为500,内部错误:
HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; odata.metadata=minimal
Expires: -1
Server: Microsoft-IIS/8.5
REQ_ID: 5b92fe5f-7856-4817-bc18-210b20fa2b08
OData-Version: 4.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 24 Jul 2017 15:33:39 GMT
Content-Length: 2869
{
"error":{
"code":"","message":"Workflow must be marked as on-demand or child workflow.","innererror":{
"message":"Workflow must be marked as on-demand or child workflow.","type":"System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]","stacktrace":" at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode, ExecutionContext executionContext)\r\n at Microsoft.Crm."
}
}
}
提示很清晰,工作流必须要选中 作为按需流程 或者是子流程才行。于是我停用该工作流,然后激活该工作流,再来尝试,执行结果如下:

如果查看原版的返回内容是这样的:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; odata.metadata=minimal
Expires: -1
Server: Microsoft-IIS/8.5
REQ_ID: 0ad59cc7-ab4e-49bf-a05b-8b522db29c75
Preference-Applied: return=representation
OData-Version: 4.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 24 Jul 2017 15:39:04 GMT
Content-Length: 38136
{
"@odata.context":"https://demo.luoyong.me/api/data/v8.2/$metadata#asyncoperations/$entity","statecode":0,"asyncoperationid":"f9349b37-8670-e711-826c-000d3a80c8b8","_regardingobjectid_value":"b907de1b-cf99-e611-8161-000d3a80c8b8","_owningextensionid_value":"c8556024-8670-e711-826c-000d3a80c8b8","createdon":"2017-07-24T15:39:03Z","_workflowactivationid_value":"c8556024-8670-e711-826c-000d3a80c8b8","depth":1,"messagename":"ExecuteWorkflow","_ownerid_value":"e9cd027f-26a3-e511-80c6-000d3a807ec7","name":"\u7f57\u52c7\u6d4b\u8bd5\u5b9e\u4f53\u5b57\u6bb5\u503c\u53d8\u66f4\u540e\u8fd0\u884c\u7684\u5de5\u4f5c\u6d41","requestid":null,"friendlymessage":null,"retrycount":null,"startedon":null
}
可以看到执行成功,我去界面上也可以看到执行了工作流:

利用Fiddler修改请求信息通过Web API执行Dynamics 365操作(Action)实例的更多相关文章
- 不借助工具在浏览器中通过Web API执行Dynamics 365操作(Action)实例
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复262或者20170727可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...
- 利用Fiddler修改请求信息通过Web API执行操作(Action)实例
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Fiddler修改请求的参数,重新执行请求
打开Fiddler4,打开浏览器,输入请求地址,例如:http://www.meizu.com 1. 拿出host信息:tongji.meizu.com 2. 拿出URL信息:/flow/mc?v ...
- 使用JS通过Web API执行批量操作,多个操作是一个事务!
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复235或者20161105可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- Fiddler修改请求、返回数据
相信你们有听过说“绕过前端”,但是可能想不到要怎样才能绕过前端呢? 首先,我们要知道什么是绕过前端?比如:登录用户名限制数字.6位,用户在登录页面填写用户名符合要求,使用Fiddler作为代理,拦截登 ...
- AngularJS使用OData请求ASP.NET Web API资源的思路
本篇整理AngularJS使用OData请求ASP.NET Web API资源的思路. 首先给ASP.NET Web API插上OData的翅膀,通过NuGet安装OData. 然后,给control ...
- Web API 2 入门——Web API 2中的操作结果(谷歌翻译)
在这篇文章中 空虚 HttpResponseMessage IHttpActionResult 其他返回类型 作者:Mike Wasson 本主题描述ASP.NET Web API如何将控制器操作的返 ...
- 通过C#代码调用Dynamics 365 Web API执行批量操作
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Fiddler修改请求和响应
通过设置断点,Fiddler可以做到: 1. 修改HTTP请求头信息.例如修改请求头的UA, Cookie, Referer 信息,通过"伪造"相应信息达到达到相应的目的(调试,模 ...
随机推荐
- [Postman]Postman导航(3)
Postman提供了一个多窗口和多标签界面,供您使用API. 此界面设计为您提供尽可能多的API空间. 侧边栏 邮差侧边栏可让您查找和管理请求和集合.侧边栏有两个主要选项卡: 历史记录 和 ...
- Cocos2d-x环境配置步骤
Cocos2d-x环境配置: (1)安装Visual Studio 2013 软件安装包为:VS2013_RTM_ULT_CHS.iso文件,将其解压后可以直接安装,也可以使用虚拟光驱等软件进行安装. ...
- python列表(list)的简单学习
列表是由一系列按特定顺序排列的元素组成, 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表.字典(即嵌套 ...
- Merge branch 'master' of xxx error
Merge branch 'master' of xxx Please enter a commit message to explain why this merge is necessary,es ...
- Centos7单机部署ELK+x-pack
ELK分布式框架作为现在大数据时代分析日志的常为大家使用.现在我们就记录下单机Centos7部署ELK的过程和遇到的问题. 系统要求:Centos7(内核3.5及以上,2核4G) elk版本:6.2. ...
- python不同开根号速度对比
import time import math import numpy as np def timeit1(): s = time.time() for i in range(750000): z= ...
- 【python小工具】我在bilibili个人资料里控制家里的电脑
今天在52学习到的,大佬A是在网易云音乐 歌单设置 里,过程没看到,封装一个exe了,可以控制本地cmd命令\ 思路很奇特,想了一下感觉实现应该简单,就打算自己实现一下\ 两步走:网页正则和本地 ...
- Spring系列之DI的原理及手动实现
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 前言 在上一章中,我们介绍和简单实现了容器的部分功能,但是这里还留下了很多的问题.比如我们在构造bean实例的时 ...
- SpringBoot 配置文件application.properties
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- ZAB协议简介
Zookeeper 使用 Zookeeper Atomic Broadcast (ZAB) 协议来保障分布式数据一致性. ZAB是一种支持崩溃恢复的消息广播协议,采用类似2PC的广播模式保证正常运行时 ...