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']   ) );

以错误结束:

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

如何发送多个q输入文本?如我所见,API 不允许q[]类型数组,而是使用多个q参数。但是在php我们不能在数组中多次拥有相同的键......

4

5 回答 5

1

正如评论中所建议的那样,您可以为 POST 数据提供字符串,而不是使用 POSTFIELDS 数据数组(或 PHP 中的任何数组)中不能重复键的数组

我的卷曲功能

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;
}

请求的配置:

$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 ) );
}

似乎可以正常工作并返回:

{
  "data": {
    "translations": [
      {
        "translatedText": "un autre",
        "model": "nmt"
      },
      {
        "translatedText": "l'éléphant",
        "model": "nmt"
      },
      {
        "translatedText": "banane",
        "model": "nmt"
      },
      {
        "translatedText": "femme",
        "model": "nmt"
      }
    ]
  }
}
于 2019-02-16T14:58:35.553 回答
1

我相信这个 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')
));
(...)
}

并称它为

var_dump ( curl("https://www.googleapis.com/language/translate/v2",
 ['key'=>$key, 'q'=>array("hello","world"),
 'source'=>"en", 'target'=>'ru']   ) );
于 2019-02-16T14:47:21.877 回答
1

您应该对帖子字段进行编码。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']   ) );

相关的是这篇文章这篇文章

于 2019-02-16T14:47:57.627 回答
0

对于其他人在这里找到他们的方式并寻找如何在一个简单的 GET 请求中翻译多个文本到Google Cloud Translation v2 REST API,您只需q=向您的 URL 添加多个参数。

无需乱用 cURL,只需使用file_get_contents并继续您的生活。像这样的东西可以完成这项工作:

$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);
于 2021-09-25T19:57:20.887 回答
0

这是我工作良好的代码片段。

$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";
$params = array(
    'source'=>"en",
    'target'=> "sr-Latn",//serbian sr
    'format'=>"text",   
);
$post=implode('&',array(sprint_f('&q=%s',implode('&q=',array($text1,$text2)),urldecode(http_build_query($params)))));
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']);
于 2022-01-10T17:19:35.150 回答