首页 > 解决方案 > 构建 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"}

我确定我忽略了一些明显的东西,但任何帮助将不胜感激。

标签: phpweb-servicesrandomget

解决方案


先说几件事。假设一个 url 如 `test.php?n=4':

  1. 修复不断出现的错误。当我实现脚本时,这立即引发了错误。

    function handle_request() {
        if(empty($_GET["n"]))
        {
            return 'EMPTY';
        }
        elseif(!isset($_GET["n"]))
        {
            return 'VAR_NOT_SET';
        }
        else
        {
            return $_GET["n"];
        }
    }
    
  2. 在您的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;
         }
     }
    

推荐阅读