yii php curl请求中的嵌入变量无法解析(错误102)

dldeef67  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(90)

我正在使用php和yii框架来整合外部API,目标是提交一个表单,向内部端点发送一个带有两个参数的请求(下面描述的action方法),然后让action方法将参数沿着到外部API。
由于发送的参数来自表单,因此我需要能够在查询外部API的action方法中动态设置它们。我通过将前端请求中的参数设置为变量,然后将这些变量嵌入到CURLOPT_POSTFIELDS中来实现这一点。
问题在于:
如果我将两个参数值硬编码到action方法中,或者如果我 * 仅 * 嵌入$propertyId变量,我会收到预期的响应。当我嵌入$customerName变量时,我会收到来自外部API的错误响应:

{"error":{"code":102,"message":"The format of your request body can not be parsed."}}}

我紧接着$customerName变量赋值插入了一个var_dump,并确认它确实是一个字符串,它与基于外部API文档的预期数据类型相匹配。

string(9) "Test Name"

这就是我遇到的问题,因为硬编码一个字符串可以得到预期的响应,但是嵌入一个包含一个字符串的变量却不能得到预期的响应。我认为外部API方面可能有问题,但是看到只有在这样一个特定的条件下才会出现失败,我觉得在字符串中嵌入变量时我遗漏了一些东西。
全动作法:

public function actionSearch()
    {
        $request = Yii::$app->request->post('params');
        $propertyId = $request['propertyId'];
        $customerName = $request['customerName'];
        var_dump($customerName);

        try {
            $curl = curl_init();

            curl_setopt_array($curl, array(
                CURLOPT_URL => 'https://some/endpoint',
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => '',
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 0,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => 'GET',
                CURLOPT_POSTFIELDS =>'{
                    "auth": {
                        "type" : "basic"
                    },
                    "requestId" : 15,
                    "method": {
                        "name": "searchCustomers",
                        "version":"r1",
                        "params": {
                            "propertyId" : '. $propertyId .',
                            "search" : '. $customerName .' // problematic parameter
                        }
                    }
                }',
                CURLOPT_HTTPHEADER => array(
                    'Content-Type: APPLICATION/JSON; CHARSET=UTF-8',
                    'Authorization: Basic',
                ),
            ));

            $response = curl_exec($curl);

            curl_close($curl);
            return json_decode($response, true);
        } catch(\Exception $e) {
            throw new LogicException('Error fetching customer data');
        }
    }

备选 * 工作 * CURLOPT_POSTFIELDS

CURLOPT_POSTFIELDS =>'{
    "auth": {
        "type" : "basic"
    },
    "requestId" : 15,
    "method": {
        "name": "searchCustomers",
        "version":"r1",
        "params": {
            "propertyId" : "12345",
            "search" : "Test Name"
        }
    }
}'

前端请求有效载荷

{
  params: {
    propertyId: "12345", 
    customerName: "Test Name"
  }
}
s8vozzvw

s8vozzvw1#

你错过了变量的换行,因为你创建的是JSON,所以字符串需要用double qoute换行。
您可以在赋值时 Package 它,也可以在JSON对象中 Package 它。

$customerName = '"'. $request['customerName'] . '"';

还是好多了;

$customerName = sprintf('"%s"', $request['customerName']);

相关问题