【问题标题】:400 bad request in google translate free api using curl谷歌中的 400 错误请求使用 curl 翻译免费 api
【发布时间】:2015-09-21 03:51:20
【问题描述】:

我正在尝试使用从 Firefox 的 S3 Google Translator 插件中提取的免费 G​​oogle Translate API,即。

https://translate.google.com/translate_a/single?client=t&sl=auto&
tl=en&hl=en&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t
&dt=at&ie=UTF-8&oe=UTF-8&otf=2&srcrom=1&ssel=0&tsel=0&q=Hello

在 PHP cURL 中,即。

$isPOST=isset($_POST) && !empty($_POST);
$q=$isPOST ? $_POST['q'] : $_GET['q'];

$url='https://translate.google.com/translate_a/single';
$data='client=t&sl=auto&tl=en&hl=en&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&otf=2&srcrom=1&ssel=0&tsel=0&q='.$q;
$ch=curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_URL, !$isPOST ? $url.'?'.$data : $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if($isPOST){
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
$return=curl_exec($ch);
curl_close($ch);

我正在使用 ajax 调用此页面..

$.ajax({
    type: text.length>750 ? 'post' : 'get',
    url: 'translate.php',
    data: 'q='+text,
    success: function(d){ alert(d); }
});

但这一切,我得到了谷歌翻译的回复,即。

Error: 400. That’s an error.
Your client has issued a malformed or illegal request. That’s all we know.

请帮我解决这个错误并获取翻译文本..

【问题讨论】:

    标签: javascript php ajax curl http-status-code-400


    【解决方案1】:

    我在浏览器中检查了您的 URL,它显示 400 错误。这意味着非法请求。 试试http://www.sitepoint.com/using-google-translate-api-php/这个网址。

    <?php
        $apiKey = '<paste your API key here>';
        $text = 'Hello world!';
        $url = 'https://www.googleapis.com/language/translate/v2?key=' . $apiKey . '&q=' . rawurlencode($text) . '&source=en&target=fr';
    
        $handle = curl_init($url);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($handle);                 
        $responseDecoded = json_decode($response, true);
        curl_close($handle);
    
        echo 'Source: ' . $text . '<br>';
        echo 'Translation: ' . $responseDecoded['data']['translations'][0]['translatedText'];
    ?>
    

    【讨论】:

    • 但是如果你看到 S3 Google Translator Firefox 插件源,它使用相同的 url 来翻译文本...
    • 另外,如果您尝试打开网址,即。 translate.google.com/translate_a/…,然后它会在一个txt文件中给出翻译,所以它的工作......
    • 问题只是对数据进行 url_encode。我遇到了同样的问题,我通过简单地对数据进行 url_encoding 并将方法保留为 GET 来解决它。这就是它在浏览器中工作的原因,因为您在地址栏中粘贴的任何内容在发布之前都是 url 编码的
    【解决方案2】:

    抱歉,我尝试使用相同的代码进行 POST 并且它有效.. 谢谢大家。

    【讨论】:

    • 很高兴,编码愉快
    【解决方案3】:

    我在 Visual Basic 6 项目中遇到了同样的问题,Thamaraiselvam 的评论引导我朝着正确的方向前进。 我正在正确构建 URL,如果我在浏览器中尝试它可以工作,但在 vb6 的 http 组件中它不起作用。解决方案是简单地对发送的数据进行 url_encode。 (把它放在浏览器中是自动做的)

    希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2018-02-19
      • 2012-09-16
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多