如何将 Chrome 请求重复为 curl 命令?
How to repeat Chrome requests as curl commands?
对于我所做的一些自动化测试,我必须记录来自 Chrome 的请求,然后在 curl 命令中重复它们。
我开始检查如何做...
我的做法是:
- 打开开发人员工具时访问网站。
- 发出请求,确保它们已记录在控制台中。
- 右键单击请求,select 'Save as HAR with content',然后保存到文件。
- 然后运行下面的php脚本来解析HAR文件并输出正确的卷曲:
脚本:
<?php
$contents=file_get_contents('/home/elyashivl/har.har');
$json = json_decode($contents);
$entries = $json->log->entries;
foreach ($entries as $entry) {
$req = $entry->request;
$curl = 'curl -X '.$req->method;
foreach($req->headers as $header) {
$curl .= " -H '$header->name: $header->value'";
}
if (property_exists($req, 'postData')) {
# Json encode to convert newline to literal '\n'
$data = json_encode((string)$req->postData->text);
$curl .= " -d '$data'";
}
$curl .= " '$req->url'";
echo $curl."\n";
}
不知道他们在哪个版本中添加了此功能,但 Chrome 现在提供 "Save as cURL" 选项:
您可以通过在开发人员工具的“网络”选项卡下并右键单击 XHR 请求来访问它
基于 ElyashivLavi 的代码,我添加了文件名参数、读取文件时的错误检查、将 curl 置于详细模式并禁用 Accept-encoding 请求 header,这通常导致返回压缩输出,这将使其难以调试,以及自动执行 curl 命令:
<?php
function bail($msg)
{
fprintf(STDERR, "Fatal error: $msg\n");
exit(1);
}
global $argv;
if (count($argv) < 2)
bail("Missing HAR file name");
$fname = $argv[1];
$contents=file_get_contents($fname);
if ($contents === false)
bail("Could not read file $fname");
$json = json_decode($contents);
$entries = $json->log->entries;
foreach ($entries as $entry)
{
$req = $entry->request;
$curl = 'curl --verbose -X '.$req->method;
foreach($req->headers as $header)
{
if (strtolower($header->name) === "accept-encoding")
continue; // avoid gzip response
$curl .= " -H '$header->name: $header->value'";
}
if (property_exists($req, 'postData'))
{
# Json encode to convert newline to literal '\n'
$data = json_encode((string)$req->postData->text);
$curl .= " -d '$data'";
}
$curl .= " '$req->url'";
echo $curl."\n";
system($curl);
}
对于我所做的一些自动化测试,我必须记录来自 Chrome 的请求,然后在 curl 命令中重复它们。 我开始检查如何做...
我的做法是:
- 打开开发人员工具时访问网站。
- 发出请求,确保它们已记录在控制台中。
- 右键单击请求,select 'Save as HAR with content',然后保存到文件。
- 然后运行下面的php脚本来解析HAR文件并输出正确的卷曲:
脚本:
<?php
$contents=file_get_contents('/home/elyashivl/har.har');
$json = json_decode($contents);
$entries = $json->log->entries;
foreach ($entries as $entry) {
$req = $entry->request;
$curl = 'curl -X '.$req->method;
foreach($req->headers as $header) {
$curl .= " -H '$header->name: $header->value'";
}
if (property_exists($req, 'postData')) {
# Json encode to convert newline to literal '\n'
$data = json_encode((string)$req->postData->text);
$curl .= " -d '$data'";
}
$curl .= " '$req->url'";
echo $curl."\n";
}
不知道他们在哪个版本中添加了此功能,但 Chrome 现在提供 "Save as cURL" 选项:
您可以通过在开发人员工具的“网络”选项卡下并右键单击 XHR 请求来访问它
基于 ElyashivLavi 的代码,我添加了文件名参数、读取文件时的错误检查、将 curl 置于详细模式并禁用 Accept-encoding 请求 header,这通常导致返回压缩输出,这将使其难以调试,以及自动执行 curl 命令:
<?php
function bail($msg)
{
fprintf(STDERR, "Fatal error: $msg\n");
exit(1);
}
global $argv;
if (count($argv) < 2)
bail("Missing HAR file name");
$fname = $argv[1];
$contents=file_get_contents($fname);
if ($contents === false)
bail("Could not read file $fname");
$json = json_decode($contents);
$entries = $json->log->entries;
foreach ($entries as $entry)
{
$req = $entry->request;
$curl = 'curl --verbose -X '.$req->method;
foreach($req->headers as $header)
{
if (strtolower($header->name) === "accept-encoding")
continue; // avoid gzip response
$curl .= " -H '$header->name: $header->value'";
}
if (property_exists($req, 'postData'))
{
# Json encode to convert newline to literal '\n'
$data = json_encode((string)$req->postData->text);
$curl .= " -d '$data'";
}
$curl .= " '$req->url'";
echo $curl."\n";
system($curl);
}