php - 检查 API 中的强制参数

标签 php codeigniter api validation

我正在构建一个 API,它需要 POST 一些强制参数。大约有 15 个强制参数应该传递给 API,如果缺少任何参数,例如“可以”,我想向开发人员显示相关错误不处理;电子邮件参数丢失”。

我已经实现了逻辑,但它运行得不好,而且似乎用多余的代码编写得很糟糕。这是当前的方法

 if ($data['email'] AND array_key_exists('email', $data)) {
                if (!validateEmail($data['email'])) {
                    $transaction_error = 'Invalid email';
                }
            } else {
                $transaction_error = 'Parameter email is missing';
            }
            if (!($data['addr'] AND array_key_exists('addr', $data))) {
                $transaction_error= 'Parameter addr is missing';
            }
            if (array_key_exists('show_shipping_addr', $data)) {
                if (!verifyBinary($data['show_shipping_addr'])) {
                    $transaction_error = 'Invalid show_shipping_addr';
                }
            } else {
                $transaction_error = 'Parameter show_shipping_addr is missing';
            }
            if (array_key_exists('authorize_user', $data)) {
                if (!verifyBinary($data['authorize_user'])) {
                    $transaction_error = 'Invalid authorize_user';
                }
            } else {
                $transaction_error = 'Parameter authorize_user is missing';
            }
            if ($data['mobileNo'] AND array_key_exists('mobileNo', $data)) {
                if (!validateMobileNo($data['mobileNo'])) {
                    $transaction_error = 'Invalid mobileNo';
                }
            } else {
                $transaction_error = 'Parameter mobileNo is missing';
            }
            if ($data['currency_code'] AND array_key_exists('currency_code', $data)) {
                if (!validateCurrencyCode($data['currency_code'])) {
                    $transaction_error = 'Invalid currency_code';
                }
            } else {
                $transaction_error = 'Parameter currency_code is missing';
            }
            if ($data['checksum_method'] AND array_key_exists('checksum_method', $data)) {
                if (!validateChecksumMethod($data['checksum_method'])) {
                    $transaction_error = 'Invalid checksum_method';
                }
            } else {
                $transaction_error = 'Parameter checksum_method is missing';
            }
            if ($data['zipcode'] AND array_key_exists('zipcode', $data)) {
                if (!validateZipCode($data['zipcode'])) {
                    $transaction_error = 'Invalid zipcode';
                }
            } else {
                $errors[$i++] = 'Parameter zipcode is missing';
            }
            if ($data['f_name'] AND array_key_exists('f_name', $data)) {
                if (!validateAlphaString($data['f_name'])) {
                    $transaction_error = 'Invalid name';
                }
            } else {
                $transaction_error = 'Parameter f_name is missing';
            }
            if ($data['state'] AND array_key_exists('state', $data)) {
                if (!validateAlphaString($data['state'])) {
                    $transaction_error = 'Invalid state';
                }
            } else {
                $transaction_error = 'Parameter state is missing';
            }
            if ($data['country'] AND array_key_exists('country', $data)) {
                if (!validateAlphaString($data['country'])) {
                    $transaction_error = 'Invalid country';
                }
            } else {
                $transaction_error = 'Parameter country is missing';
            }
            if ($data['city'] AND array_key_exists('city', $data)) {
                if (!validateAlphaString($data['city'])) {
                    $transaction_error = 'Invalid city';
                }
            } else {
                $transaction_error = 'Parameter city is missing';
            }
            /* Validation of mandatory parameters ends here */
            /* Validation of optional parameters starts here
             *shipping_email
             *shipping_mobileNo
             *shipping_zipcode
             *l_name
             *shipping_addr 
             *shipping_city
             *shipping_state
             *shipping_country
             *surl
             *furl
             *rurl
             */
            if (array_key_exists('l_name', $data)) {
                if (!validateAlphaString($data['l_name'])) {
                    $transaction_error = 'Invalid l_name';
                }
            }
            if (array_key_exists('shipping_addr', $data)) {
                if (!$data['shipping_addr']) {
                    $transaction_error = 'Parameter shipping_addr is missing';
                }
            }
            if (array_key_exists('shipping_mobileNo', $data)) {
                if (!validateMobileNo($data['shipping_mobileNo'])) {
                    $transaction_error = 'Invalid shipping_mobileNo';
                }
            }
            if (array_key_exists('shipping_city', $data)) {
                if (!validateAlphaString($data['shipping_city'])) {
                    $transaction_error = 'Invalid shipping_city';
                }
            }
            if (array_key_exists('shipping_state', $data)) {
                if (!validateAlphaString($data['shipping_state'])) {
                    $transaction_error = 'Invalid shipping_state';
                }
            }
            if (array_key_exists('shipping_country', $data)) {
                if (!validateAlphaString($data['shipping_country'])) {
                    $transaction_error = 'Invalid shipping_country';
                }
            }
            if (array_key_exists('shipping_zipcode', $data)) {
                if (!validateZipCode($data['shipping_zipcode'])) {
                    $transaction_error = 'Invalid shipping_zipcode';
                }
            }

            if(isset($api_error)) // IF there are API error pages are rendered
            {
                $api_error_array['api_error'] = $api_error;
                $this->render_api_errors($api_error_array);
            }
            else if (isset($transaction_error)) { //If there are transactional errors,user is redirected back to mercahnt response url
                $api_data = $this->paymentgateway->getAPIData($data['app_used'], $data['apikey']);
                $data['response_url'] = $api_data['response_url'];
                $data['transaction_errors'] = $transaction_error;
                $this->paymentgateway->logApiRequest($data['app_used'], $transaction_error, 'Notice', $data['ip_address'], $data['ip_address_customer']);
                $this->redirect_transactional_error($data);
            } else {
                $this->process($data); //Calls the process function when everything is done
            }

我有一些必填字段集和一些非必填字段集。如果设置了非必填字段,则需要检查其有效性。

请建议一种方便的方法来验证发布请求而不会使代码变得繁重。我已经看到了以下代码

if($_SERVER['REQUEST_METHOD'] != "POST")
    die("Error: Wrong method");
$fields = array("f1", "f2", "f3", "f4");
$field_names = array("field1", "field2", "field3", "field4");
$length = count($fields);
$missing_input = array();
for($i = 0; $i < $length; $i++)
    if(empty($_POST[$fields[$i]]))
        $missing_input[] = $field_names[$i];
if(!empty($missing_input))
    die("Error: " . implode(", ", $missing_input)");

来自SO,这是有道理的。有人可以建议我验证API中的强制参数并据此显示相关错误的最佳实践吗?我可以创建一个将检查参数的函数,而不是单独验证每个参数并显示错误?

最佳答案

您可以创建一组需要强制/验证的字段名称

$validate = array(
  'username' => array('mandatory' => true, 'regex' => '/^[a-z0-9_-]{3,16}$/'),
  'password' => array('mandatory' => true, 'regex' => null),
  // Same like the above example you can create all validation 
)

$missing_input = array();

foreach($_POST as $key => $val){
  $mandatory = isset($validate[$key]) ? $validate[$key] : false;
  if($mandatory && !trim($val)){
    // Manage error here
    $missing_input[] = $key;
  } 
  // Same like above get the regex and validate the field here and manage the error
}

// Return / Print error array
if(!empty($missing_input))
die("Error: " . implode(", ", $missing_input)");

您还可以在 $validate 数组中定义最小和最大限制,并在 foreach 循环内进行相应的验证,根据您的要求进行简单的逻辑验证。

关于php - 检查 API 中的强制参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26925881/

相关文章:

php - 在 CodeIgniter 中为 ( :any)

php - 我正在尝试在 codeigniter 中编写 UPDATE 查询,但由于某种原因,它插入了带有默认值的新记录

php - 无法加载第二个 Controller

amazon-web-services - AWS Lambda 中 id_token 与 access_token 使用的最佳实践

javascript - Google Maps JavaScript API - 从捕捉到道路的折线创建多边形

api - 创建 Java 库

php - 后台论坛OctoberCMS中的关系

php - 当数据库中输入的日期为 YYYY-MM-DD 格式时,如何制作此格式?

php - round() 除了对数字进行四舍五入还有什么作用?

javascript - Ob_end_flush 不断产生错误