我正在使用fetch API将一些数据发送到translate.php文件,这是我的JS代码:
const translation = {
word: 'Hello'
};
fetch('http://yandex.local/translate.php', {
method: 'POST',
body: JSON.stringify(translation),
headers: {
'Content-Type': 'application/json'
}
}).then(res => {
return res.text();
}).then(text => {
console.log(text);
})
这是我尝试在translate.php上获取数据的方法:
$postData = json_decode(file_get_contents("php://input"), true);
$word = $postData['word'];
这是我的cURL请求:
$word = $postData['word'];
$curl = curl_init();
$request = '{
"texts": "Hello",
"targetLanguageCode": "ru",
"sourceLanguageCode": "en"
}';
curl_setopt($curl, CURLOPT_URL, 'https://translate.api.cloud.yandex.net/translate/v2/translate');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
"Authorization: Api-Key 123456",
"Content-Type: application/json"
));
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
$err = curl_error($curl);
if($err) {
echo 'Curl Error: ' . $err;
} else {
$response = json_decode($result, true);
print_r($response['translations']['0']['text']);
}
curl_close($curl);
运行此代码时,我得到了Hello俄语的翻译,它是Привет。但是,如果我用$ word替换请求对象中的“ Hello”,则会出现错误:尝试访问类型为null的值的数组偏移量
这是我重写请求对象的方式:
$request = '{
"texts": $word,
"targetLanguageCode": "ru",
"sourceLanguageCode": "en"
}';
当我检查我的translate.php的XHR似乎都还不错时,我的状态为200,请求有效负载显示了我的数据。另外,“ hello”一词也可以在我的index.php控制台中正确显示
答案 0 :(得分:1)
永远不要手动创建JSON字符串(即,我的意思是将JSON文本直接硬编码为字符串变量)。它可能会导致各种语法问题。
请替换
$request = '{
"texts": "Hello",
"targetLanguageCode": "ru",
"sourceLanguageCode": "en"
}';
使用
$requestObj = array(
"texts" => $word,
"targetLanguageCode" => "ru",
"sourceLanguageCode" => "en"
);
$request = json_encode($requestObj);
这将产生更可靠的输出,并正确包含$word
变量。
P.S。您的实际问题是,在PHP中,除非字符串被双引号引起,否则变量不会插在字符串内(请参见manual)。您的$request
字符串是单引号。
因此,$word
字符串内的$request
未被更改为“ Hello”,而是保留为文字字符串“ $ word”。另外,由于删除了引号,因此远程服务器尝试解析它将不是有效的JSON时,因为JSON中的文本变量必须在引号周围加上引号。这正是这种容易产生的错误,也是为什么我说不手工构建JSON的原因!
您的版本将会输出
{"texts":$word,"targetLanguageCode":"ru","sourceLanguageCode":"en"}
我的版本将(正确)输出:
{"texts":"Hello","targetLanguageCode":"ru","sourceLanguageCode":"en"}
(当然,鉴于上面的注释线程,我当然应该添加,无论我进行了什么更改,除非您向包含正确数据的{。首先。)