【问题标题】:Multiple input (q parameters) in Google Translate API , with PHP CURLGoogle Translate API 中的多个输入(q 参数),带有 PHP CURL
【发布时间】:2019-07-10 11:05:26
【问题描述】:

当我们向 [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 中,我们不能在数组中多次使用相同的键...

【问题讨论】:

  • 文档https://cloud.google.com/translate/docs/reference/translate 建议参数只是q 而不是q[],您应该根据需要经常重复..
  • @RamRaider 但 php 不允许数组中有多个相同的键
  • postfields 使用字符串而不是数组?

标签: php curl google-cloud-platform google-translate google-translation-api


【解决方案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']   ) );

【讨论】:

    【解决方案2】:

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

    相关的是this postthis post

    【讨论】:

      【解决方案3】:

      正如评论中所建议的,您可以为 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"
            }
          ]
        }
      }
      

      【讨论】:

        【解决方案4】:

        对于其他人在这里找到他们的方式并寻找如何在一个简单的 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);
        

        【讨论】:

          【解决方案5】:

          这是我运行良好的代码 sn-p。

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

          【讨论】:

            猜你喜欢
            • 2018-08-11
            • 1970-01-01
            • 2013-04-08
            • 2018-06-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多