昨天在写一段程序的时候卡了好久,卡在了一段curl代码上面:
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $config['ocr_api']);
$headers = [
'X-Appid:' . $appid,
'X-CurTime:' . $cur_time,
'X-Param:' . $x_param,
'X-CheckSum:' . $x_check_sum
];
$body = base64_encode(file_get_contents($pic_path));
curl_setopt($ch, CURLOPT_HEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'image' => $body
]));
$result = curl_exec($ch);
这一段代码其实是调用能力平台的一个ocr接口,传过去一张图片的数据,返回图片中的文本内容。感兴趣的可以试着看下哪里问题。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
答案是curl_setopt($ch, CURLOPT_HEADER, $header)
。
我是直播的时候在写这段代码,可能由于紧张并没有发现一个类似笔误的错误。因为设置curl的参数时,CURLOPT_HEADER
表示获取请求头信息,而如果想设置header内容,则需要使用到CURLOPT_HTTPHEADER
这个参数。这次的调试反映出了三个问题:
- 我没有代码编译器般的大脑,这种细节问题真的很难发现;
- 对CURLOPT参数不够熟悉;
- php这种弱变量类型的编程语言,很方便,随便写,但如果碰到类似的问题,真的需要肉眼去debug,编译器是没办法帮我们定位到这个问题的。换而言之,如果我使用的是java,针对于
CURLOPT_HEADER
这个参数,接收的类型只有true or false,那么当我传一个array过去的时候,java的编译器就会报错,这样就不会出现这种问题了。所以说,弱变量,有利有弊,双刃剑~~
仅以为记~~