我正在使用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"
}
}
1条答案
按热度按时间s8vozzvw1#
你错过了变量的换行,因为你创建的是JSON,所以字符串需要用double qoute换行。
您可以在赋值时 Package 它,也可以在JSON对象中 Package 它。
还是好多了;