iOS用libcurl發(fā)起一個(gè)get請(qǐng)求域醇,并保存返回?cái)?shù)據(jù)到沙盒

這個(gè)需求分為:
1.如何接入libcurl庫(kù),
2.如何用libcurl發(fā)起get請(qǐng)求蓉媳,
3.如何將數(shù)據(jù)保存到沙盒路徑下

一.第一個(gè)需求譬挚,由于libcurl只有源碼,需要你自己去編譯各平臺(tái)下的庫(kù)酪呻,怎么編譯參考下我寫的另一篇文章:編譯支持iOS的libcurl+OpenSSL庫(kù)(支持https IPv6)
然后就是引用libcurl.a庫(kù)了减宣,記得在build phase里面的link binary with ibraries 里面引用libz.tbdlibresolv.tbd這兩個(gè)系統(tǒng)庫(kù)

二.第二個(gè)需求,發(fā)起請(qǐng)求的方法如下

bool getUrl(const char *filename,char *url)
{
    CURL *curl;
    CURLcode res;
    FILE *fp;
    if ((fp = fopen(filename, "wt+")) == NULL){
        // 返回結(jié)果用文件存儲(chǔ)
        return false;
    }
    struct curl_slist *headers = NULL;
    //增加HTTP header
    headers = curl_slist_append(headers, "Accept:application/json");
    headers = curl_slist_append(headers, "Content-Type:application/json");
    headers = curl_slist_append(headers, "charset:utf-8");
    curl = curl_easy_init();    // 初始化
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改協(xié)議頭
        curl_easy_setopt(curl, CURLOPT_URL,url);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);   // 執(zhí)行
        NSLog(@"請(qǐng)求返回值是%i",res);
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    fclose(fp);
    return true;
}

特別提醒玩荠, curl_global_init(CURL_GLOBAL_ALL);這個(gè)函數(shù)是全局初始化函數(shù)漆腌,只能調(diào)用一次,所以最好在didFinishLanuch里面調(diào)用阶冈,如果在curl_easy_init();之前還未實(shí)現(xiàn)闷尿,那么libcurl會(huì)自動(dòng)執(zhí)行一次。所以多線程下最好主動(dòng)調(diào)用該函數(shù)以防止在線程中curl_easy_init時(shí)多次調(diào)用女坑。
這是因?yàn)殡m然libcurl是線程安全的填具,但curl_global_init是不能保證線程安全的,所以不要在每個(gè)線程中都調(diào)用curl_global_init匆骗,didFinishLanuch里調(diào)用一次就行了灌旧。

三. 如何上層調(diào)用
由于curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 這個(gè)方法是c的方法绑咱,所以傳進(jìn)來的目錄filename也要是c String才行,所以上層調(diào)用的時(shí)候得這么寫:

NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths firstObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"wow.log"];
getUrl([filePath cStringUsingEncoding:NSUTF8StringEncoding],"https://www.baidu.com");

這樣就可以將獲取到數(shù)據(jù)寫入到應(yīng)用的document目錄下枢泰,保存為wow.log文件描融。

四. 對(duì)請(qǐng)求的返回值的說明
也就是對(duì) curl_easy_perform()函數(shù)返回值的說明,0表示請(qǐng)求正常返回衡蚂,詳情看下面

CURLE_OK = 0, 0: no error 
CURLE_UNSUPPORTED_PROTOCOL, 1: unsupported protocol 
CURLE_FAILED_INIT, 2: failed init 
CURLE_URL_MALFORMAT, 3: URL using bad/illegal format or missing URL 
CURLE_URL_MALFORMAT_USER, 4: unknown error 
CURLE_COULDNT_RESOLVE_PROXY, 5: couldn't resolve proxy name 
CURLE_COULDNT_RESOLVE_HOST, 6: couldn't resolve host name 
CURLE_COULDNT_CONNECT, 7: couldn't connect to server 
CURLE_FTP_WEIRD_SERVER_REPLY, 8: FTP: weird server reply 
CURLE_FTP_ACCESS_DENIED, 
CURLE_FTP_USER_PASSWORD_INCORRECT, 10: unknown error 
CURLE_FTP_WEIRD_PASS_REPLY, 11: FTP: unknown PASS reply 
CURLE_FTP_WEIRD_USER_REPLY, 12: FTP: unknown USER reply 
CURLE_FTP_WEIRD_PASV_REPLY, 13: FTP: unknown PASV reply 
CURLE_FTP_WEIRD_227_FORMAT, 14: FTP: unknown 227 response format 
CURLE_FTP_CANT_GET_HOST, 15: FTP: can't figure out the host in the PASV response 
CURLE_FTP_CANT_RECONNECT, 16: FTP: can't connect to server the response code is unknown 
CURLE_FTP_COULDNT_SET_BINARY, 17: FTP: couldn't set binary mode 
CURLE_PARTIAL_FILE, 18: Transferred a partial file 
CURLE_FTP_COULDNT_RETR_FILE, 19: FTP: couldn't retrieve (RETR failed) the specified file 
CURLE_FTP_WRITE_ERROR, 20: FTP: the post-transfer acknowledge response was not OK 
CURLE_FTP_QUOTE_ERROR, 21: FTP: a quote command returned error 
CURLE_HTTP_RETURNED_ERROR, 22: HTTP response code said error 
CURLE_WRITE_ERROR, 23: failed writing received data to disk/application 
CURLE_MALFORMAT_USER, 24: unknown error 
CURLE_UPLOAD_FAILED, 25: upload failed (at start/before it took off) 
CURLE_READ_ERROR, 26: failed to open/read local data from file/application 
CURLE_OUT_OF_MEMORY, 27: out of memory 

CURLE_OPERATION_TIMEOUTED, 28: a timeout was reached 
CURLE_FTP_COULDNT_SET_ASCII, 29: FTP could not set ASCII mode (TYPE A) 
CURLE_FTP_PORT_FAILED, 30: FTP command PORT failed 
CURLE_FTP_COULDNT_USE_REST, 31: FTP command REST failed 
CURLE_FTP_COULDNT_GET_SIZE, 32: FTP command SIZE failed 
CURLE_HTTP_RANGE_ERROR, 33: a range was requested but the server did not deliver it 
CURLE_HTTP_POST_ERROR, 34: internal problem setting up the POST 
CURLE_SSL_CONNECT_ERROR, 35: SSL connect error 
CURLE_BAD_DOWNLOAD_RESUME, 36: couldn't resume download 
CURLE_FILE_COULDNT_READ_FILE, 37: couldn't read a file:// file 
CURLE_LDAP_CANNOT_BIND, 38: LDAP: cannot bind 
CURLE_LDAP_SEARCH_FAILED, 39: LDAP: search failed 
CURLE_LIBRARY_NOT_FOUND, 40: a required shared library was not found

五. 單純地寫一個(gè)請(qǐng)求
如果你不需要寫入本地窿克,只是想發(fā)起請(qǐng)求,當(dāng)然也是可以的毛甲,簡(jiǎn)化上面的代碼年叮,結(jié)果如下

CURLcode getUrl(char *url)
{
    CURL *curl;
    CURLcode res = CURLE_OK;
    struct curl_slist *headers = NULL;
    //增加HTTP header
    headers = curl_slist_append(headers, "Accept:application/json");
    headers = curl_slist_append(headers, "Content-Type:application/json");
    headers = curl_slist_append(headers, "charset:utf-8");
    curl = curl_easy_init();    // 初始化
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改協(xié)議頭
        curl_easy_setopt(curl, CURLOPT_URL,url);
        res = curl_easy_perform(curl);   // 執(zhí)行
        NSLog(@"res===%i",res);
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return res;
}

調(diào)用的話就用getUrl("https://www.baidu.com");
打完收工

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玻募,隨后出現(xiàn)的幾起案子只损,更是在濱河造成了極大的恐慌,老刑警劉巖七咧,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跃惫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡艾栋,警方通過查閱死者的電腦和手機(jī)爆存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝗砾,“玉大人先较,你說我怎么就攤上這事〉苛福” “怎么了闲勺?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扣猫。 經(jīng)常有香客問我菜循,道長(zhǎng),這世上最難降的妖魔是什么苞笨? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任债朵,我火速辦了婚禮,結(jié)果婚禮上瀑凝,老公的妹妹穿的比我還像新娘序芦。我一直安慰自己,他們只是感情好粤咪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布谚中。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宪塔。 梳的紋絲不亂的頭發(fā)上磁奖,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音某筐,去河邊找鬼比搭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛南誊,可吹牛的內(nèi)容都是我干的身诺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抄囚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼准给!你這毒婦竟也來了孝凌?” 一聲冷哼從身側(cè)響起臀栈,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陷遮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后重挑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗓化,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年攒驰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟆湖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片故爵。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玻粪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诬垂,到底是詐尸還是另有隱情劲室,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布结窘,位于F島的核電站很洋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隧枫。R本人自食惡果不足惜喉磁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望官脓。 院中可真熱鬧协怒,春花似錦、人聲如沸卑笨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至妖滔,卻和暖如春隧哮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背座舍。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工沮翔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人曲秉。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓鉴竭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親岸浑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搏存,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354