關於curl的命令行的總結與實踐

前言

   由於項目需要,需要在項目中搭建一套接口,但是實際操作的時候發現自己對於curl瞭解甚少,當時能隨手打出的估計也就只有在服務器上debug時使用curl本地連接排查問題了(笑)
   閒話少說,就直接進入正題了,首先知物需要知底,那麼就從起源開始查起吧。(格物致知嘛,(笑))

CURL的起源

   博主查了一下,嗯。。。。赫然發現這個起源,我沒有找到小故事。。。或者說這個東西是基石,沒有什麼爲什麼。。。這個小結跳過。。。
   這個博文是半年之前寫的,然後到今天,又有一個需求接到手的時候,我依然決然地再次在相同問題上踩了坑,所以現在痛定思非,必須總結一下自己踩過的坑(ps:其實也不算坑,只是自己一方面對網絡請求協議的不熟悉,一方面被相關接口單位的這個數據格式校驗打的頭皮發麻,當然還有一部分原因在於這個公司文檔,嗯,全英文,然後還寫的部分參數不對。。。當然最主要原因還是自己看文檔不仔細,沒想好就岔開步子往前邁。。)

CURL的常用命令

   curl衆所周知是基石(我就是不害臊,現學現用),那麼他的命令也是有很多,常用的有這麼幾個函數,首先是/。。。。







   對,沒錯,上面就是我幾個月前寫的博客放在草稿箱裏面喫灰,嗯。。。就是要亮出來,讓自己害臊。。。
   閒話少說,我來總結一下自己對curl這個工具使用的總結

總體來講分爲這幾步:
一、curl_init() 初始化工具
二、curl_setopt() 設置請求
三、curl_exec() 執行工具
四、curl_close() 關閉句柄

而我們通常使用最多就是在第二步,而理解難度,或者說理解深度重頭都在這個第二步,如何設置請求,怎麼寫請求,這就要求你要對相關的網絡協議的理解和應用,而這一部分也恰恰是我所欠缺的。就比如說請求頭有那些行?。。。好吧,這個只要知道經常使用的幾部分就可以了
在這裏插入圖片描述
如圖,當然這些只是一小部分,更多主要在於這個用的頻率上,我這邊就不擴展地去寫了,反正寫太多又會倦怠。。。。
那麼我就拿經常使用的restfulApi的封裝以及不同格式的數據的上傳來具體記錄一下自己所遇到的一些問題。
首先這個restfulApi我們知道是將請求按照不同的方式來進行劃分,有delete、put、get、post等,那麼不同的請求我們通常以CURLOPT_CUSTOMREQUEST這個選項進行設置

curl_setopt($url,CURLOPT_CUSTOMREQUEST, $method)

這個就簡單明瞭了,我這邊就不闡釋 了。。。
那麼這個數據要怎麼傳呢?
get方式就不說了。。。那麼以post爲例,如何傳遞不同的數據格式呢?
比如說json格式/x-www-form-urlencode格式,嗯,這兩個我是經常遇到的,所以就先記錄一下,以後遇到其他的再寫(牛氣)

首先說json格式,這要求我們這樣寫,即把請求頭按照這樣格式聲明

'Content-Type: application/json',
'Content-Length: ' . strlen($data)

嗯,就是這樣,具體原因待查。。。

另一個就簡單多了。。。或者說熟練多了。。這兩個是基礎中的基礎,打擾了,大佬

Content-Type: application/x-www-form-urlencoded

然後這些信息以數組形式保存,然後寫入到這次請求的請求頭
即用到了這個參數CURLOPT_HTTPHEADER
語義化你懂不懂?

//代碼如下
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

下來貼個自己封裝的curl的函數,僅供記錄。。畢竟很菜

	public static function curl($url, $header = null, $data = null, $method = 'post')
	{
		//初始化curl
		$curl = curl_init();
		//設置請求頭
		if (is_array($header)) {
			curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		}
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//不輸出內容
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);//https請求不驗證host和證書
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);//設置請求類型
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//傳遞數據
		//獲取採集結果
		$output = curl_exec($curl);
		//關閉cURL鏈接
		curl_close($curl);
		//解析json
		$json = json_decode($output, true);
		//判斷json還是xml
		if ($json) {
			return $json;
		} else {
			#驗證xml
			libxml_disable_entity_loader(true);//禁止加載外部實體
			#解析xml
			$xml = simplexml_load_string($output, 'SimpleXMLElement', LIBXML_NOCDATA);
			return $xml;
		}
	}


特別表明一下,如果curl返回的結果一直是false,但是命令行使用卻正常的話,需要從以下幾個角度去分析和判斷:
	一、是否是ssl證書的事情
	比如無法驗證ssl證書,選項CURLOPT_SSL_VERIFYPEER
	二、可以用curl工具中的調試工具進行排查
	命令curl_error($ch);浪費了半小時在搞這個玩意兒,真的煩。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章