简体   繁体   English

Google Translate API 中的多个输入(q 参数),带有 PHP CURL

[英]Multiple input (q parameters) in Google Translate API , with PHP CURL

When we make a query to [Translate API][1]:当我们查询 [Translate API][1] 时:

function curl($url, $post_array=false){ 
        $handle = curl_init();
        if (FALSE === $handle) 
            throw new Exception('failed to CURL initialize; '. __FILE__);
        curl_setopt($handle, CURLOPT_URL, $url);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
        if($post_array) {
            curl_setopt($handle, CURLOPT_POST, 1 );
            curl_setopt($handle, CURLOPT_POSTFIELDS, $post_array );
        } 
        curl_setopt($handle,CURLOPT_HTTPHEADER,array('X-HTTP-Method-Override: GET'));
        $response = curl_exec($handle);
        return $response;
}


var_dump ( curl("https://www.googleapis.com/language/translate/v2", ['key'=>$key, 'q[]'=>"hello", 'q[]'=>"world", 'source'=>"en", 'target'=>'ru']   ) );

ends in error:以错误结束:

{
  "error": {
    "code": 400,
    "message": "Required Text",
    "errors": [
      {
        "message": "Required Text",
        "domain": "global",
        "reason": "required"
      }
    ]
  }
}

How to send multiple q input texts?如何发送多个q输入文本? As I see, the API doesn't allow q[] type arrays, instead it uses multiple q parameters.如我所见,API 不允许q[]类型的数组,而是使用多个q参数。 But in php we can't have same key multiple times in array...但是在php我们不能在数组中多次拥有相同的键......

i believe this API supports JSON, and JSON supports arrays, so just do 我相信这个API支持JSON,而JSON支持数组,所以只要

function curl($url, array $post_array){ 
        $handle = curl_init();
        curl_setopt_array($ch,array(
CURLOPT_POST=>1,
CURLOPT_POSTFIELDS=>json_encode($post_data),
CURLOPT_HTTPHEADER=>array('Content-Type: application/json')
));
(...)
}

and call it like 并称它为

var_dump ( curl("https://www.googleapis.com/language/translate/v2",
 ['key'=>$key, 'q'=>array("hello","world"),
 'source'=>"en", 'target'=>'ru']   ) );

You should encode the post fields. 您应该对发布字段进行编码。 PHP offers http_build_query . PHP提供了http_build_query

function curl($url, $post_array=false){ 
        $handle = curl_init();
        if (FALSE === $handle) 
            throw new Exception('failed to CURL initialize; '. __FILE__);
        curl_setopt($handle, CURLOPT_URL, $url);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
        if($post_array) {
            curl_setopt($handle, CURLOPT_POST, 1 );
            curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($post_array) );
        } 
        curl_setopt($handle,CURLOPT_HTTPHEADER,array('X-HTTP-Method-Override: GET'));
        $response = curl_exec($handle);
        return $response;
}


var_dump ( curl("https://www.googleapis.com/language/translate/v2", ['key'=>$key, 'q'=> array("hello", "world"), 'source'=>"en", 'target'=>'ru']   ) );

Relevant are this post and this post . 相关的是这个帖子这个帖子

As suggested in a comment, rather than using an array where there can not be repeated keys in the POSTFIELDS data array ( or any array in PHP ) you can supply a string for the POST data 正如评论中所建议的那样,您可以为POST数据提供一个字符串,而不是使用在POSTFIELDS数据数组(或PHP中的任何数组)中不能重复键的数组。

My curl function 我的卷发功能

function curl( $url=NULL, $options=NULL ){
    $cacert='c:/wwwroot/cacert.pem';    #<---- edit to suit
    $vbh = fopen('php://temp', 'w+');


    $res=array(
        'response'  =>  NULL,
        'info'      =>  array( 'http_code' => 100 ),
        'headers'   =>  NULL,
        'errors'    =>  NULL
    );
    if( is_null( $url ) ) return (object)$res;

    session_write_close();

    /* Initialise curl request object */
    $curl=curl_init();
    if( parse_url( $url,PHP_URL_SCHEME )=='https' ){
        curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, true );
        curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 2 );
        curl_setopt( $curl, CURLOPT_CAINFO, $cacert );
    }

    /* Define standard options */
    curl_setopt( $curl, CURLOPT_URL,trim( $url ) );
    curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
    curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $curl, CURLOPT_FAILONERROR, true );
    curl_setopt( $curl, CURLOPT_HEADER, false );
    curl_setopt( $curl, CURLINFO_HEADER_OUT, false );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $curl, CURLOPT_BINARYTRANSFER, true );
    curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, 20 );
    curl_setopt( $curl, CURLOPT_TIMEOUT, 60 );
    curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' );
    curl_setopt( $curl, CURLOPT_MAXREDIRS, 10 );
    curl_setopt( $curl, CURLOPT_ENCODING, '' );

    curl_setopt( $curl, CURLOPT_VERBOSE, true );
    curl_setopt( $curl, CURLOPT_NOPROGRESS, true );
    curl_setopt( $curl, CURLOPT_STDERR, $vbh );



    /* Assign runtime parameters as options */
    if( isset( $options ) && is_array( $options ) ){
        foreach( $options as $param => $value ) curl_setopt( $curl, $param, $value );
    }

    /* Execute the request and store responses */
    $res=(object)array(
        'response'  =>  curl_exec( $curl ),
        'info'      =>  (object)curl_getinfo( $curl ),
        'errors'    =>  curl_error( $curl )
    );
    rewind( $vbh );
    $res->verbose=stream_get_contents( $vbh );
    fclose( $vbh );
    curl_close( $curl );
    return $res;
}

The configuration for the request: 请求的配置:

$key='AIzaSyxxxxxxxxxxxxxxxxxxx9oIhY8Q8xxxxx';

$url='https://www.googleapis.com/language/translate/v2';
$arr=array( 'another', 'elephant', 'banana', 'woman' );

/* some translate parameters */
$params=array(
    'target'    =>  'fr',
    'format'    =>  'text',
    'source'    =>  'en',
    'model'     =>  'nmt'
);
/* the POST data */
$query=implode( '&', array( 
    sprintf( 'key=%s&q=%s',$key, implode( '&q=', $arr ) ), #query
    urldecode( http_build_query( $params ) ) #google params
));

$config=array(
    CURLOPT_POST        =>  true,
    CURLOPT_POSTFIELDS  =>  $query
);

$res=curl( $url, $config );
if( $res->info->http_code==200 ){
    printf('<pre>%s</pre>',print_r( $res->response,true ) );
}

Appears to work OK and returns: 似乎可以正常工作并返回:

{
  "data": {
    "translations": [
      {
        "translatedText": "un autre",
        "model": "nmt"
      },
      {
        "translatedText": "l'éléphant",
        "model": "nmt"
      },
      {
        "translatedText": "banane",
        "model": "nmt"
      },
      {
        "translatedText": "femme",
        "model": "nmt"
      }
    ]
  }
}

For others finding their way here and looking for how to translate multiple texts in a simple GET-request to the Google Cloud Translation v2 REST API , you just need to add multiple q= parameters to your URL.对于其他人在这里找到自己的方式并寻找如何将简单的 GET 请求中的多个文本翻译到Google Cloud Translation v2 REST API ,您只需将多个q=参数添加到您的 URL 中。

No need to mess around with cURL, just use file_get_contents and get on with your life.无需处理 cURL,只需使用file_get_contents并继续您的生活。 Something like this would do the job:像这样的事情可以完成这项工作:

$texts = ['foo', 'bar', 'hello world'];

// Translate from english to swedish
$queryParams = [
    'target' => 'sv',
    'source' => 'en',
    'format' => 'text',
    'key'    => 'INSERT_YOUR_API_KEY_HERE',
];

// Now let's add q=<text> for each text
$queryString = http_build_query($queryParams);
foreach($texts as $t){
    $queryString .= '&q='.rawurlencode($t);
}

$url = "https://translation.googleapis.com/language/translate/v2?$queryString";

$responseBody = file_get_contents($url);
$responseArr = json_decode($responseBody, true);

you should use q parameter as json_encode(array($text1,$text2))你应该使用 q 参数作为 json_encode(array($text1,$text2))

this is my well-worked code snippet.这是我工作良好的代码片段。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://translation.googleapis.com/language/translate/v2?API-KEY');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$text1="The Great Pyramid of Giza (also known as the Pyramid of Khufu or the Pyramid of Cheops) is the oldest and largest of the three pyramids in the Giza pyramid complex.";
$text2="this is second text example";
$post = array(
    'q'=> json_encode(array($text1,$text2)),
    'source'=>"en",
    'target'=> "sr",//serbian sr
    'format'=>"text",   
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
$result=json_decode($response,true);
print_r($result['data']['translations']);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM