参考官方文档:https://www.fiddlerbook.com/fiddler/dev/scriptsamples.asp
json
// 反序列化
static function jsonDecode(str : String){return Fiddler.WebFormats.JSON.JsonDecode(str).JSONObject;
}
// 序列化
static function jsonEncode(jsonObject : Object) {return Fiddler.WebFormats.JSON.JsonEncode(jsonObject);
}
使用
// 反序列化
var job = jsonDecode('{"name":"zhangsan"}');
// 修改、增加属性
job["age"] = 18;
// 序列化
var jsonString = jsonEncode(job);FiddlerObject.log("job.name: \t" + job["name"]);
// 输出 job.name: zhangsanFiddlerObject.log("new json info: \t" + jsonString);
// 输出 new json info: {"age":18, "name":"zhangsan"}
发请求
发post请求,下面代码是用文心一言生成的
static function doPostData(reqUrl:String,reqBody:String, callback: Function){//把响应的json内容通过http发送其它地方var _xhr = new ActiveXObject('Microsoft.XMLHTTP');var url = reqUrl;// 这里处理回调事件_xhr.onreadystatechange = function() {if (_xhr.readyState === 4) {if (_xhr.status === 200) {callback(_xhr.responseText);} else {callback(new Error("Request failed with status " + _xhr.status));}}}_xhr.open('POST', url, true);_xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");_xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");_xhr.send(reqBody);
}
路径检查
如果要判断请求路径中有没有指定字符,可以使用uriContains
方法,不区分大小写,而且是拿完整路径来判断的。如果需要区分大小写可以使用fullUrl.Contains
方法
FiddlerObject.log(oSession.fullUrl);
// 输出 http://localhost:8888/userInfo?type=user
FiddlerObject.log('uriContains(type):\t'+oSession.uriContains('type'));
// 输出 uriContains(type): true
FiddlerObject.log('uriContains(userinfo):\t'+oSession.uriContains('userinfo'));
// 输出 uriContains(userinfo): true
FiddlerObject.log('uriContains(localhost):\t'+oSession.uriContains('localhost'));
// 输出 uriContains(localhost): true
FiddlerObject.log('uriContains(LOCALHOST):\t'+oSession.uriContains('LOCALHOST'));
// 输出 uriContains(LOCALHOST): trueFiddlerObject.log('fullUrl.Contains(userinfo):\t'+oSession.fullUrl.Contains("userinfo"));
// 输出 fullUrl.Contains(userinfo): false
FiddlerObject.log('fullUrl.Contains(userInfo):\t'+oSession.fullUrl.Contains("userInfo"));
// 输出 fullUrl.Contains(userInfo): true
FiddlerObject.log('fullUrl.Contains(localhost):\t'+oSession.fullUrl.Contains("localhost"));
// 输出 fullUrl.Contains(localhost): true
FiddlerObject.log('fullUrl.Contains(LOCALHOST):\t'+oSession.fullUrl.Contains("LOCALHOST"));
// 输出 fullUrl.Contains(LOCALHOST): false
路径和查询参数
FiddlerObject.log(oSession.fullUrl);
// 输出 http://localhost:8888/userInfo?type=user&format=json
FiddlerObject.log("host:\t"+oSession.host);
// 输出 host: localhost:8888
FiddlerObject.log("hostname:\t"+oSession.hostname);
// 输出 hostname: localhost// 修改
oSession.host="test.bayden.com:9090";
oSession.hostname="test.bayden.com";FiddlerObject.log('PathAndQuery:\t'+oSession.PathAndQuery);
// 输出 PathAndQuery: /userInfo?type=user&format=json// 修改路径和查询参数
oSession.PathAndQuery="/version2.css";
请求头
请求头和响应头的方法一致,以下代码中的oRequest
与oResponse
都可以互换
// 添加、修改请求头
oSession.oRequest["NewHeaderName"] = "New header value";
oSession.oRequest.headers.Add("Content-Type", "text/html");// 获得请求头,下面两种方法都可以,键值不区分大小写
oSession.oRequest['cookie'];
oSession.oRequest.headers['Cookie'];// 删除请求头
oSession.oRequest.headers.Remove("Cookie");// 是否存在指定请求头
oSession.oRequest.headers.Exists("Cookie")
// 是否存在指定请求头,且值包含
oSession.oResponse.headers.ExistsAndContains("Content-Type", "image/")
// 是否存在指定请求头,且值相等
oSession.oRequest.headers.ExistsAndContains("Content-Type", "application/json;charset=utf-8")
解压缩
如果发现拿到的请求体或响应体是gzip压缩后的,可以使用以下方法解压缩
//对请求数据解码
oSession.utilDecodeRequest();
//对返回数据解码
oSession.utilDecodeResponse()
请求体
获取与生效
// 确定请求体编码格式
FiddlerObject.log("encoding:\t"+oSession.GetRequestBodyEncoding());
// encoding: System.Text.UTF8Encoding// 获取,下面两种方法都可以
var oBodyString = System.Text.Encoding.UTF8.GetString(oSession.requestBodyBytes);
// 应该是默认使用utf-8解码
var oRequestBody = oSession.GetRequestBodyAsString()// 生效修改后的请求体
oSession.utilSetRequestBody(oRequestBody);
检查与修改
// 查询请求体中是否包含指定字符,不存在返回-1。第二个参数表示是否区分大小写,false为不区分
oSession.utilFindInRequest("document.cookie", false);
// 在请求体中替换内容
oSession.utilReplaceInRequest('<b>','<u>');
响应体
获取和生效的方法与请求体的方法类似
// 确定请求体编码格式
FiddlerObject.log("encoding:\t"+oSession.GetResponseBodyEncoding());
// encoding: System.Text.UTF8Encoding// 获取,下面两种方法都可以
var oBodyString = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
// 应该是默认使用utf-8解码
var oResBody = oSession.GetResponseBodyAsString();// 生效修改后的请求体
oSession.utilSetResponseBody(oResBody);
模拟DNS解析
如果请求地址中主机部分使用的是域名,则可以模拟修改windows
中的hosts
文件的效果
// 这样所有对域名subdomain.example.com的请求,都会被转发到128.123.123.123这个主机上
if (oSession.HostnameIs("subdomain.example.com")){oSession.bypassGateway = true; // Prevent this request from going through an upstream proxyoSession["x-overrideHost"] = "128.123.133.123"; // DNS name or IP address of target server
}
控制当前请求在Fiddler界面列表中的展示效果
以下是将第二列的英文翻译成中文后的Markdown格式表格:
Flag Name | 含义 |
---|---|
ui-hide | 从会话列表中隐藏会话,就是不会显示在列表中,但请求仍会被fiddler代理,会直接放行。会话将继续运行。隐藏会话上的断点将被忽略。注意:隐藏会话将释放原本用于在内存中保存会话数据的内存。 |
ui-color | 此标志的值决定了在会话列表中呈现此会话时使用的字体颜色。可以写red 、green 这些标准颜色 |
ui-backcolor | 此标志的值决定了在会话列表中此会话条目使用的背景颜色。 |
ui-bold | 设置为true 时,此会话的条目在会话列表中将加粗显示。 |
ui-italic | 设置为true 时,此会话的条目在会话列表中将斜体显示。 |
ui-strikethrough | 设置为true 时,此会话的条目在会话列表中将加删除线显示。 |
ui-customcolumn | 此标志的值显示在Fiddler会话列表的“用户定义”列中。 |
ui-breakrequest | 如果存在,将在发出请求之前暂停此会话的执行。暂停后就可以修改请求体等信息,然后再放行 |
ui-breakresponse | 如果存在,将在收到响应后暂停此会话的执行。暂停后就可以修改响应内容 |
ui-comments | 用户为此会话设置的注释(如果有)。 |
x-overrideHost | 提供用于DNS解析目的的Host:Port组合。请注意,此机制不会更改请求上的HOST头,因此如果存在上游网关,则此机制无效。 |
x-overrideGateway | 提供应用于代理此请求的网关的Host:Port组合,或直接发送到原始服务器的DIRECT。 |
x-serversocket | 只读。包含有关服务器套接字重用状态的字符串。 |
x-securepipe | 只读。包含有关安全服务器套接字重用状态的字符串。 |
x-no-decrypt | 如果设置在CONNECT隧道上,则隧道中的流量将不会被解密。需要Fiddler v2.0.8.9或更高版本。 |
https-Client-Certificate | 应附加到此安全请求的客户端证书(例如.CER)的文件名。需要Fiddler v2.1.0.3或更高版本。 |
x-SuppressProxySupportHeader | 阻止Fiddler向请求HTTP/401或HTTP/407响应中添加“Proxy-Support: Session-Based-Authentication”头,这些响应请求Negotiate或NTLM身份验证。需要Fiddler v2.1.4.2或更高版本。 |
x-ProcessInfo | 有关本地请求来源的信息(模块名称和进程ID)。就是在Fiddler界面中,列表的Process 那一列显示的内容。需要Fiddler v2.1.4.1或更高版本。 |
x-clientIP | 只读。指示发送此请求的客户端IP。当网络上的多台计算机指向单个Fiddler实例时,此功能特别有用。 |
x-clientport | 只读。指示发送此请求的客户端上的端口。 |
x-hostIP | 只读。指示用于此请求的服务器的IP地址。 |
x-TTFB | 已弃用。使用oSession.Timer代替。到响应的第一个字节的时间(以毫秒为单位)。 |
x-TTLB | 已弃用。使用oSession.Timer代替。到响应的最后一个字节的时间(以毫秒为单位)。 |
request-trickle-delay | 延迟每个出站请求数据千字节的毫秒数。 |
response-trickle-delay | 延迟每个入站响应数据千字节的毫秒数。 |
x-HTTPProtocol-Violation | 包含在处理此会话时遇到的HTTP协议违规的数据。 |
x-replywithfile | 此标志的值是Captures/Responses文件夹中(或完全限定的文件名)的文件名,该文件包含要返回给客户端的HTTP响应,而不是将请求发送到服务器。 |
x-repliedwithfile | 只读。包含x-replywithfile中指定的文件名,在自动响应加载后。 |
log-drop-request-body | 在将请求发送到服务器后,从会话列表中删除请求正文。对于最小化内存使用很有用。 |
log-drop-response-body | 在将响应发送到客户端后,从会话列表中删除响应正文。对于最小化内存使用很有用。 |
x-OverrideCertCN | 指定应出现在此CONNECT隧道的Fiddler生成证书的CN字段中的主机名。 |