LibreTranslate API:JS Fetch与PHP Curl调用结果不一致问题
问题原因
你的PHP请求与JavaScript请求的格式不匹配:
- JavaScript发送的是JSON格式的请求体,
q字段为数组类型,服务器能正确识别并完成批量翻译。 - 当前PHP代码用
http_build_query生成表单编码的请求体,还将q数组转成JSON字符串,服务器会把这个字符串当成单个待翻译文本,因此直接返回原内容;单个单词时q是普通字符串,所以能正常翻译。 - 之前取消请求头注释后报错,是因为设置了
Content-Type: application/json,但请求体仍为表单编码格式,服务器解析失败。
修正后的PHP代码
public function actionTest() { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.libretranslate.com/translate"); curl_setopt($ch, CURLOPT_POST, 1); // 构造与JS完全一致的JSON请求体 $postData = json_encode([ 'q' => ["maison", "chat"], 'source' => 'fr', 'target' => 'es', 'format' => 'text', // 和JS保持一致,使用text而非html 'api_key' => 'XXXXXXXXXXX' ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); // 设置正确的Content-Type请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json' )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $server_output = json_decode(curl_exec($ch)); print_r($server_output); curl_close($ch); }
关键修正点
- 用
json_encode生成完整的JSON请求体,和JavaScript的JSON.stringify行为保持一致。 - 设置
Content-Type: application/json请求头,明确告知服务器请求体为JSON格式。 - 将
format字段统一为text,避免不必要的格式差异影响结果。
内容的提问来源于stack exchange,提问作者cbdev
相关产品推荐
相关产品推荐

