用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/microwind/ai-skills --skill http命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | HTTP请求调试器 |
| description | 当调试HTTP请求时,分析请求/响应对,排查API问题,理解请求流程。调试请求并分析响应,解决网络通信问题。 |
| license | MIT |
HTTP请求可能静默失败或表现异常。调试请求以理解实际发送和接收的内容,而不是你以为发送和接收的内容。大多数集成问题都是请求/响应不匹配,只有通过适当调试才能发现。
核心原则: 不要猜测 - 调试。查看实际发送和接收的内容,而不是你以为发送和接收的内容。
始终:
触发短语:
问题:
必要的请求头部没有发送
后果:
- 身份验证失败
- 服务器拒绝请求
- 内容类型错误
- 缓存问题
解决方案:
- 检查请求头设置
- 验证认证头部
- 确认内容类型
- 添加必要头部
问题:
请求体格式不正确或编码错误
后果:
- 服务器解析失败
- 4xx错误响应
- 数据丢失
- 集成失败
解决方案:
- 验证JSON格式
- 检查字符编码
- 确认内容长度
- 测试请求体
问题:
网络连接不稳定或被阻止
后果:
- 请求超时
- 连接被拒绝
- DNS解析失败
- 代理问题
解决方案:
- 检查网络连接
- 验证DNS设置
- 测试代理配置
- 检查防火墙规则
网络层:
- 检查DNS解析
- 验证端口连通性
- 测试SSL连接
- 分析网络延迟
应用层:
- 验证HTTP方法
- 检查URL格式
- 分析请求头部
- 验证请求体
业务层:
- 检查认证信息
- 验证权限设置
- 分析业务逻辑
- 测试数据格式
浏览器开发者工具:
- Network面板监控
- 请求/响应查看
- 性能分析
- 错误诊断
命令行工具:
- curl命令测试
- wget下载测试
- telnet连接测试
- ping网络测试
专业工具:
- Postman接口测试
- Fiddler抓包分析
- Wireshark网络分析
- Charles代理调试
import requests
import json
import time
from typing import Dict, Any, Optional
import logging
from urllib.parse import urlparse
class HTTPRequestDebugger:
"""HTTP请求调试器"""
def __init__(self, log_level=logging.INFO):
self.logger = logging.getLogger(__name__)
self.logger.setLevel(log_level)
self.session = requests.Session()
# 设置默认超时
self.session.timeout = 30
# 启用详细日志
logging.basicConfig(
level=log_level,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
def debug_request(self, method: str, url: str, **kwargs) -> Dict[str, Any]:
"""调试HTTP请求"""
debug_info = {
'request': {},
'response': {},
'timing': {},
'errors': []
}
try:
# 记录请求开始时间
start_time = time.time()
# 准备请求信息
debug_info['request'] = {
'method': method.upper(),
: url,
: (kwargs.get(, {})),
: kwargs.get(, {}),
: kwargs.get(, {}),
: kwargs.get(, {}),
: kwargs.get(, {}),
: kwargs.get(, .session.timeout)
}
.logger.info()
.logger.debug()
.logger.debug()
debug_info[][]:
.logger.debug()
response = .session.request(method, url, **kwargs)
end_time = time.time()
debug_info[] = {
: start_time,
: end_time,
: end_time - start_time
}
debug_info[] = {
: response.status_code,
: response.reason,
: (response.headers),
: (response.content),
: response.encoding,
: (response.cookies),
: response.url,
: response.history
}
:
content_type = response.headers.get(, ).lower()
content_type:
debug_info[][] = response.json()
content_type:
debug_info[][] = response.text
:
debug_info[][] =
Exception e:
debug_info[][] =
debug_info[].append()
.logger.info()
.logger.debug()
.logger.debug()
._check_common_issues(debug_info)
debug_info
requests.exceptions.Timeout e:
debug_info[].append()
.logger.error()
requests.exceptions.ConnectionError e:
debug_info[].append()
.logger.error()
requests.exceptions.RequestException e:
debug_info[].append()
.logger.error()
Exception e:
debug_info[].append()
.logger.error()
debug_info
():
response = debug_info.get(, {})
request = debug_info.get(, {})
status_code = response.get()
status_code >= :
status_code == :
debug_info[].append()
status_code == :
debug_info[].append()
status_code == :
debug_info[].append()
status_code == :
debug_info[].append()
status_code >= :
debug_info[].append()
duration = debug_info.get(, {}).get(, )
duration > :
debug_info[].append()
content_type = response.get(, {}).get(, )
content_type:
debug_info[].append()
headers = request.get(, {})
headers:
debug_info[].append()
() -> [, ]:
comparison = {
: [],
: [],
: [],
: []
}
req1 = debug_info1.get(, {})
req2 = debug_info2.get(, {})
req1.get() != req2.get():
comparison[].append({
: ,
: req1.get(),
: req2.get()
})
req1.get() != req2.get():
comparison[].append({
: ,
: req1.get(),
: req2.get()
})
resp1 = debug_info1.get(, {})
resp2 = debug_info2.get(, {})
resp1.get() != resp2.get():
comparison[].append({
: ,
: resp1.get(),
: resp2.get()
})
time1 = debug_info1.get(, {})
time2 = debug_info2.get(, {})
(time1.get(, ) - time2.get(, )) > :
comparison[].append({
: ,
: time1.get(),
: time2.get()
})
comparison
() -> [, ]:
methods :
methods = [, , , , ]
results = {}
method methods:
:
debug_info = .debug_request(method, url)
results[method] = debug_info
Exception e:
results[method] = {: (e)}
results
() -> :
request = debug_info.get(, {})
method = request.get(, )
url = request.get(, )
headers = request.get(, {})
data = request.get(, {}) request.get(, {})
curl_parts = [, , method]
key, value headers.items():
curl_parts.extend([, ])
data:
(data, ):
data = json.dumps(data, ensure_ascii=)
curl_parts.extend([, data])
curl_parts.append(url)
.join( (part) (part) part curl_parts)
debugger = HTTPRequestDebugger()
get_result = debugger.debug_request(
,
,
params={: },
headers={: }
)
()
(json.dumps(get_result, indent=, ensure_ascii=))
post_result = debugger.debug_request(
,
,
json={: },
headers={: }
)
()
(json.dumps(post_result, indent=, ensure_ascii=))
curl_command = debugger.generate_curl_command(post_result)
()
endpoint_test = debugger.test_endpoint()
()
class HTTPRequestDebugger {
constructor(options = {}) {
this.defaultHeaders = options.headers || {};
this.timeout = options.timeout || 30000;
this.logLevel = options.logLevel || 'info';
}
async debugRequest(method, url, options = {}) {
const debugInfo = {
request: {},
response: {},
timing: {},
errors: []
};
try {
const startTime = performance.now();
// 准备请求信息
debugInfo.request = {
method: method.toUpperCase(),
url: url,
headers: { ...this.defaultHeaders, ...options.headers },
params: options.params || {},
body: options.body || null,
timeout: options.timeout || this.timeout
};
// 构建完整URL
const fullUrl = .(url, debugInfo..);
.();
.(, debugInfo..);
(debugInfo..) {
.(, debugInfo..);
}
response = (fullUrl, {
: method.(),
: debugInfo..,
: debugInfo..,
: .(debugInfo..)
});
endTime = performance.();
debugInfo. = {
: startTime,
: endTime,
: endTime - startTime
};
debugInfo. = {
: response.,
: response.,
: .(response.),
: response.,
: response.,
: response.
};
{
contentType = response..() || ;
(contentType.()) {
debugInfo.. = response.();
} (contentType.()) {
debugInfo.. = response.();
} {
blob = response.();
debugInfo.. = ;
}
} (error) {
debugInfo.. = ;
debugInfo..();
}
.();
.(, debugInfo..);
.();
.(debugInfo);
debugInfo;
} (error) {
debugInfo..();
.();
debugInfo;
}
}
() {
urlObj = (url);
.(params).( {
(params[key] !== && params[key] !== ) {
urlObj..(key, params[key]);
}
});
urlObj.();
}
() {
obj = {};
headers.( {
obj[key] = value;
});
obj;
}
() {
response = debugInfo. || {};
request = debugInfo. || {};
(response. >= ) {
(response. === ) {
debugInfo..();
} (response. === ) {
debugInfo..();
} (response. === ) {
debugInfo..();
} (response. === ) {
debugInfo..();
} (response. >= ) {
debugInfo..();
}
}
(debugInfo. && debugInfo.. > ) {
debugInfo..();
}
(!request. || !request.[]) {
debugInfo..();
}
}
() {
results = {};
( method methods) {
{
debugInfo = .(method, url);
results[method] = debugInfo;
} (error) {
results[method] = { : error. };
}
}
results;
}
() {
request = debugInfo. || {};
method = request. || ;
url = request. || ;
headers = request. || {};
body = request.;
curl = ;
.(headers).( {
curl += ;
});
(body) {
data = body === ? body : .(body);
curl += ;
}
curl += ;
curl;
}
() {
(. === || . === ) {
.(...args);
}
}
() {
.(...args);
}
}
= ({
: {
:
}
});
() {
{
getResult = .(, , {
: { : }
});
.(, getResult);
postResult = .(, , {
: { : },
: .({ : })
});
.(, postResult);
curlCommand = .(postResult);
.(, curlCommand);
endpointTest = .();
.(, endpointTest);
} (error) {
.(, error);
}
}
();