php - 构建 Web 服务以生成 n 长的十六进制字符串
问题描述
我的目标是使用 PHP 构建一个 Web 服务,给定一个表示您希望返回多少字节的数字 n,您将获得一串伪随机十六进制数字。我有它,所以如果我对 n 进行硬编码,它就可以工作,但是当我尝试让客户端选择数字时,它会返回一个错误代码(我为调试编写了错误代码)。
这是代码:
<?php
function get_random_bytes($n)
{
if(is_int($n) && $n > 0)
{
$bytes = openssl_random_pseudo_bytes($n, $cstrong);
$hex = bin2hex($bytes);
$hex_up = strtoupper($hex);
if($cstrong === TRUE)
{
return $hex_up;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
function handle_request()
{
if(empty($_GET[n]))
{
return 'EMPTY';
}
elseif(!isset($_GET[n]))
{
return 'VAR_NOT_SET';
}
else
{
return $_GET[n];
}
}
function handle_response($array)
{
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Pragma: no-cache"); // HTTP/1.0
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
echo json_encode($array);
}
function main()
{
$n = handle_request();
if(!isset($n))
{
$array=array("STATUS" => "VAR_NOT_SET");
handle_response($array);
}
elseif(empty($_GET['n']))
{
$array = array("STATUS" => "VAR_NOT_SET");
handle_response($array);
}
else
{
$bytes = get_random_bytes($n);
$array = array("random_bytes" => $bytes);
handle_response($array);
}
}
main();
?>
当我运行它时,我在浏览器上得到以下响应: {"STATUS":"VAR_NOT_SET"}
我确定我忽略了一些明显的东西,但任何帮助将不胜感激。
解决方案
先说几件事。假设一个 url 如 `test.php?n=4':
修复不断出现的错误。当我实现脚本时,这立即引发了错误。
function handle_request() { if(empty($_GET["n"])) { return 'EMPTY'; } elseif(!isset($_GET["n"])) { return 'VAR_NOT_SET'; } else { return $_GET["n"]; } }
在您的
get_random_bytes
功能中,您有if(is_int($n) && $n > 0)
. 从 $_GET 检索到的任何内容都作为string
. 我建议要么转换$n
为 anint
要么使用if(is_numeric($n) && $n > 0)
which 依次起作用。function get_random_bytes($n) { if(is_numeric($n) && $n > 0) { $bytes = openssl_random_pseudo_bytes($n, $cstrong); $hex = bin2hex($bytes); $hex_up = strtoupper($hex); if($cstrong === TRUE) { return $hex_up; } else { return FALSE; } } else { return FALSE; } }
推荐阅读
- postgresql - Postgres ltree has-a-child 查询
- css - 将 svg 转换为 css 形状
- c# - 在 WPF c# 中为子窗口禁用捕获屏幕
- linux - 如何使用 awk 或 grep 在 Linux 上删除所有不匹配的数据
- java - 发送到 JAR 文件的环境变量可在 System.getProperty 中访问,但在 System.getenv 中
- kubernetes - 如何使用 kubectl 补丁将 Serviceaccout 添加到现有的 Clusterrolebinding
- c# - Regex.Replace 函数和读取文本文件
- django - Django Channels、Docker Compose、Errno 111] 连接调用失败('127.0.0.2',6379)
- c++ - 无法使用采用 std::array 的构造函数推断类中的类型
- magento2 - Magento 2 - 结账时自动预选客户账单地址 - 未设置默认值时