Post 使用数据作为对象数组从 JS(Bixby 胶囊端点)请求 Http 调用到 PHP 服务器
Post request Http call with data as Array of Objects from JS(Bixby capsule endpoint) to PHP server
当我用 JS 发送 post 请求时,发送成功 response.But table 而不是 updating.Only 以下 postman 请求之一和更新。
我在 js 中有以下 http 调用。
JS代码
var url = "my url";
var obj = {
'wid': 4001,
'sc': 600
};
var data = [];
data.push(obj);
var params = {
"method": "update",
"userid": "94525",
"data": JSON.stringify(data) //tried with or without stringify data
};
let options = {
format: 'json',
headers: {
'accept': 'application/x-www-form-urlencoded'
}
};
var response = http.postUrl(url, params, options);
Php 函数代码:
foreach($_POST as $key=>$item) {
$GLOBALS[$key] = $item;
}
function isValidParams($params) {
$flag = true;
foreach ($params as $key) {
if(!isset($GLOBALS[$key]) || empty($GLOBALS[$key])) {
$flag = false;
break;
}
}
return $flag;
}
function update() {
$flag = isValidParams(["userid", "data"]);
if(!$flag) return;
global $mysqli, $response, $userid, $data;
$wordIdString = "";
$sc = 0;
foreach ($data as $key => $word) {
$wordIdString .= ",".$word["wid"];
$sc += $word["sc"];
}
if($sc > 0) {
$query = "UPDATE users_new SET pWIds = CONCAT(pWIds, '$wordIdString'), sc = (sc + $sc) WHERE userid = $userid";
$res = $mysqli->query($query);
}
$response["check"] = "success";
}
以下是 postman 的截图,完美运行并更新。
下面的内容不起作用。
我不明白其中的区别。我的 js 也没有按预期工作的原因是否相同。
注意:无法更改 php 代码,仅建议在 js 上进行更改。
我的 url 没有对象数组作为数据正在工作 fine.Only 这创建了 issue.I 不明白 why.Thank 你。
Abhishek Sarkar 这就是 php
对您的 post 的解释
当您 post [{"wid":4001,"sc":600}] 时,您正在向 php 发送一个字符串。为了将其转换为数组(在 php 中),您需要调整代码(您不能这样做)
现在关于您的 php 代码:
php 期望数据中的所有项目都是一个数组,而您正在发送一个对象:
{'wid': 4001,'sc': 600} 预计 ['wid'=>4001,'sc'=>600]
我猜这就是它不起作用的原因。
[已编辑] 在与 Abhishek Sarkar 交谈和测试后,我们发现这是 post 数据的正确方法:
var params = {
"method": "update",
"userid": "94525",
"data[0][wid]": "4001",
"data[0][sc]": "600",
};
供将来参考:https://bixbydevelopers.com/dev/docs/reference/JavaScriptAPI/http#httpgeturlurl-options
当我用 JS 发送 post 请求时,发送成功 response.But table 而不是 updating.Only 以下 postman 请求之一和更新。
我在 js 中有以下 http 调用。
JS代码
var url = "my url";
var obj = {
'wid': 4001,
'sc': 600
};
var data = [];
data.push(obj);
var params = {
"method": "update",
"userid": "94525",
"data": JSON.stringify(data) //tried with or without stringify data
};
let options = {
format: 'json',
headers: {
'accept': 'application/x-www-form-urlencoded'
}
};
var response = http.postUrl(url, params, options);
Php 函数代码:
foreach($_POST as $key=>$item) {
$GLOBALS[$key] = $item;
}
function isValidParams($params) {
$flag = true;
foreach ($params as $key) {
if(!isset($GLOBALS[$key]) || empty($GLOBALS[$key])) {
$flag = false;
break;
}
}
return $flag;
}
function update() {
$flag = isValidParams(["userid", "data"]);
if(!$flag) return;
global $mysqli, $response, $userid, $data;
$wordIdString = "";
$sc = 0;
foreach ($data as $key => $word) {
$wordIdString .= ",".$word["wid"];
$sc += $word["sc"];
}
if($sc > 0) {
$query = "UPDATE users_new SET pWIds = CONCAT(pWIds, '$wordIdString'), sc = (sc + $sc) WHERE userid = $userid";
$res = $mysqli->query($query);
}
$response["check"] = "success";
}
以下是 postman 的截图,完美运行并更新。
下面的内容不起作用。
我不明白其中的区别。我的 js 也没有按预期工作的原因是否相同。
注意:无法更改 php 代码,仅建议在 js 上进行更改。
我的 url 没有对象数组作为数据正在工作 fine.Only 这创建了 issue.I 不明白 why.Thank 你。
Abhishek Sarkar 这就是 php
对您的 post 的解释当您 post [{"wid":4001,"sc":600}] 时,您正在向 php 发送一个字符串。为了将其转换为数组(在 php 中),您需要调整代码(您不能这样做)
现在关于您的 php 代码: php 期望数据中的所有项目都是一个数组,而您正在发送一个对象: {'wid': 4001,'sc': 600} 预计 ['wid'=>4001,'sc'=>600]
我猜这就是它不起作用的原因。
[已编辑] 在与 Abhishek Sarkar 交谈和测试后,我们发现这是 post 数据的正确方法:
var params = {
"method": "update",
"userid": "94525",
"data[0][wid]": "4001",
"data[0][sc]": "600",
};
供将来参考:https://bixbydevelopers.com/dev/docs/reference/JavaScriptAPI/http#httpgeturlurl-options