使用PHP CURL调用IBM Tone Analyzer报401授权错误如何解决
代码问题修复说明
你代码中存在4处导致401报错以及请求失败的问题:
- Basic认证格式错误:IBM Watson的Basic认证要求将
apikey:你的实际API密钥整个字符串进行Base64编码,再拼接到Authorization: Basic之后,直接拼接明文不符合认证规范。 - 请求头设置参数错误:
CURLOPT_HEADER是布尔值参数,用于控制是否将响应头包含在返回结果中,设置自定义请求头需要使用CURLOPT_HTTPHEADER参数。 - 接口URL不完整:Tone Analyzer v3版本接口必须传递
version参数,你当前的URL结尾缺省了该参数,常用有效值为version=2017-09-21。 - CURLOPT_INFILE参数格式错误:该参数需要传入fopen打开的文件资源句柄,不能直接传入文件路径字符串。
修正后完整代码
<?php $ch = curl_init(); $file_path = "tone.json"; // 替换为你自己的实例ID和API密钥 $instance_id = '你涂黑的实例ID'; $api_key = '你涂黑的API密钥'; // 补充必填的version参数 $url = "https://api.eu-gb.tone-analyzer.watson.cloud.ibm.com/instances/{$instance_id}/v3/tone?version=2017-09-21"; // 生成符合规范的Basic认证字符串 $auth_str = base64_encode("apikey:{$api_key}"); $header_args = array( 'Accept: application/json', 'Content-Type: application/json', "Authorization: Basic {$auth_str}" ); // 打开文件获取资源句柄 $file_handle = fopen($file_path, 'r'); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_HTTPHEADER => $header_args, CURLOPT_POST => true, CURLOPT_INFILE => $file_handle, CURLOPT_INFILESIZE => filesize($file_path), CURLOPT_RETURNTRANSFER => true, // 本地调试如果有SSL证书报错可开启下一行,生产环境建议删除 // CURLOPT_SSL_VERIFYPEER => false )); $response = curl_exec($ch); // 调试时可开启下一行输出CURL本身的错误 // if(curl_errno($ch)) echo 'CURL错误:' . curl_error($ch); echo $response; fclose($file_handle); curl_close($ch); ?>
内容的提问来源于stack exchange,提问作者GIS_GIS_GIS
相关产品推荐
相关产品推荐

