我需要测试一些我编写的客户端应用程序代码,以测试它对来自Web服务器的HTTP响应中返回的各种状态代码的处理。
我安装了Fiddler 2(Web调试代理),我相信有一种方法可以使用这个应用程序修改响应,但我很难找到方法。这将是最方便的方式,因为它允许我保持客户端和服务器代码不被修改。
任何人都可以协助,因为我想拦截从服务器发送到客户端的HTTP响应,并在到达客户端之前修改状态代码吗?
非常感谢任何建议。
答案 0 :(得分:71)
好的,所以我假设您已经能够监控您的客户端/服务器流量。您要做的是在响应上设置一个断点,然后在将其发送到客户端之前摆弄它。
以下是一些不同的方法:
在断点处停止响应后,只需双击它即可在检查员中打开它。你现在有几个选择:
答案 1 :(得分:7)
另一种选择是使用Fiddler的 AutoResponder 标签(在右侧面板上)。这允许您捕获对与字符串匹配的任何URI的请求,并从文件中提供“预制”响应。该文件可以包含标头和有效负载。这种方法的优点是您不必编写FiddlerScript,也不必通过断点手动处理每个请求。
您可以在Fiddler中设置规则,如下所示(确保启用不匹配的请求直通,否则所有其他http请求都将失败)。
在此示例中,任何URI包含“fooBar”的请求都将获得预设响应。文件的格式将根据您的API而有所不同(您可以使用浏览器截取“真实”响应并以此为基础)但我的看法如下:
HTTP/1.1 409 Conflict
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, PATCH, OPTIONS
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization
Access-Control-Max-Age: 86400
Content-Type: application/vnd.api+json
Content-Length: 149
Date: Tue, 28 Mar 2017 10:03:29 GMT
{"errors":[{"code":"OutOfStock","detail":"Item not in stock","source":{"lineId":{"type":"Order line Number","id":"1"}},"meta":{"availableStock":0}}]}
我发现它需要在最后一行末尾(即json之后)回车,并且Content-Length头必须与json中的字符数相匹配,否则webapp会挂起。您的里程可能会有所不同。
答案 2 :(得分:0)
创建FiddlerScript规则。以下是我为了生成网站的本地副本而使用的内容,该网站在每个页面上故意使用403以阻止HTTrack / WGET。 https://gist.github.com/JamoCA/22db8d68a9a2fb20cb04a85360185333
/* 20180615 Fiddler rule to ignore all 403 HTTP Status errors so WGET or HTTrack can generate local copy of remote website */
SCENARIO: Changing the user agent or setting a delay isn't enough and the entire remote server is configured to respond w/403.
CONFIGURE: Add below rule to FiddlerScript OnBeforeReponse() section. Configure HTTrack/WGET/CRON to use proxy 127.0.0.01:8888 */
static function OnBeforeResponse(oSession: Session) {
if (oSession.HostnameIs("TARGETHOSTNAME_FILTER.com") && oSession.responseCode == 403) {
oSession.responseCode = 200;
oSession.oResponse.headers.HTTPResponseCode = 200;
oSession.oResponse.headers.HTTPResponseStatus = "200 OK";
}
}