cURL请求不适用于提取API中的数据

时间:2020-09-30 14:54:24

标签: php json http fetch-api

我正在使用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控制台中正确显示

1 个答案:

答案 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"}

(当然,鉴于上面的注释线程,我当然应该添加,无论我进行了什么更改,除非您向包含正确数据的{。首先。)

相关问题