前置:由于Android本身不支持curl,若要在Android中使用curl,必須引入curl庫:
將curl庫打包成.so文件—>研讀提供的相關方法—>編寫JNI中間層—>使用native關鍵字調用JNI中的方法
? ? ? ? ? ?curl庫提供的方法很多,從打包至最終調用,整個過程比較復雜,若當前只需要curl用作少量網絡請求,可以考慮將curl請求轉換成http。
? ? ? ? ? ?基本上,curl請求都可以轉換成http請求,因為抓包觀察發現,curl最后還是會使用應用層http協議去發送。
一、轉換方法
步驟一:用Charles給本機請求抓包,先用curl命令在電腦本地curl通一次,抓包獲取整個請求信息,重點關注:url、請求方式、請求頭、request、response code、response,前5項都是轉http必要的內容
? ? ? ?步驟二:在Android中,創建HttpURLConnection請求,設置請求方式(與步驟一種的請求方式保持一致:get、post、put等)
? ? ? ?步驟三:給http請求設置請求頭(與步驟一中的請求頭保持一致,注意排除一些無用的請求頭信息,例如Postman-Token、Host、accept-encoding等),額外說明:
1、若curl頭信息中包含用戶名密碼,則在http的請求頭中添加Authorization字段,內容為用戶名:密碼?用base64加密后的內容
2、若curl頭信息中包含content-length字段,則在http的請求頭中添加content-length字段,內容為請求的request body中的數據長度。
? ? ? ?步驟四:給http傳遞request參數內容(與步驟一中的request內容格式保持一致:json格式等),額外說明:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?若遇到上傳文件的請求,要尤其注意觀察request內容格式:有時要求文件上傳前后需要分割符
? ? ? ?步驟五:查看步驟一中的response code,根據response code值做為正確返回的response code值(有可能不是200,而是201、204等),額外說明:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?若遇到response code為400,獲取返回信息時,若直接獲取conn.getInputStream()會報錯,需要改為獲取conn.getErrorStream()。因為code為400時,返回的response內容被底層處理截取了。
二、舉例說明
? ? ? 1、上傳文件至JIRA
? ? ? ? ? ? Charles抓包:
?轉換后的代碼塊:
? ? ?2、普通的post請求
Charles抓包:
?轉換后的代碼塊: