這個(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.tbd
和libresolv.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");
打完收工