Contenu connexe
Similaire à Cocoa勉強会#33-意外に楽に使えるlibcurl (20)
Plus de Masayuki Nii (20)
Cocoa勉強会#33-意外に楽に使えるlibcurl
- 3. curlとlibcurlとは
•
cURL and libcurl
•
•
•
• curlコマンド
•
•
• libcurl
•
オープンソースの通信ツール
Client for URLs or Client for URL Request Library
MIT/X derivate license
URLを与えて通信処理ができる
コマンドは「カール」と発音する
curlコマンドの機能をC言語のAPIから利用できる
2009年4月8日水曜日
3
- 7. ライブラリの番号とバージョン
•
libcurl.n.dylibの「n」はライブラリの番号
•
•
•
•
•
•
•
libcurl最新版(Mac OS X 10.5.6)
•
•
•
libcurlでは、apacheのモジュールの番号で管理
SONAMEとして参照されている
libcurl.4.soなどをapacheが利用(Linuxなど)
SONAME=1/ libcurl Ver.7.4.2(2000/11)より付ける
SONAME=2/ libcurl Ver.7.7 - 2001/3/22
SONAME=3/ libcurl Ver.7.12.0 - 2004/6/12
SONAME=4/ libcurl Ver.7.16.0 - 2006/10/30
curl_version()→libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
libphp5.soやphpコマンドがlibcurl.4.dylibをロードしている
2009年4月8日水曜日
7
- 9. char *buffer;
URLへの単純なアクセス
size_t receivedCallback( void *ptr, size_t size, size_t nmemb, void *stream)
{
int endPoint = strlen( buffer );
memcpy( buffer + endPoint, ptr, size * nmemb );
buffer[endPoint + size * nmemb + 1]=0;
コールバック関数
return size * nmemb;
}
void simpleHTTP( const char* url, char *receivedStr )
{
buffer = receivedStr;
URLはhttp://…を指定
buffer[0] = 0;
❶初期化とハンドル取得
CURLcode cc = curl_global_init( CURL_GLOBAL_ALL );
if ( cc == 0 )
{
❷URLを指定する
CURL *curlHandle = curl_easy_init();
curl_easy_setopt( curlHandle, CURLOPT_URL, url );
curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback );
curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 );
❸オプションの指定
CURLcode success = curl_easy_perform( curlHandle );
デバッグに if ( success != 0 ) {
便利
sprintf( receivedStr, "libcurl error: %d", success );
❹実行
}
curl_easy_cleanup( curlHandle );
}
❺後始末
}
2009年4月8日水曜日
9
- 10. HTTPのポスト
void httpPost( const char* url, const char* postStr, char *receivedStr ) {
buffer = receivedStr;
buffer[0] = 0;
POST用のデータを作る
CURLcode cc = curl_global_init( CURL_GLOBAL_ALL );
が、URLエンコードは
if ( cc == 0 )
{
libcurlの関数を使う
CURL *curlHandle = curl_easy_init();
curl_easy_setopt( curlHandle, CURLOPT_URL, url );
curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback );
char *urlEncoded = curl_easy_escape( curlHandle , postStr , 0 );
char *param = "postdata";
char *postData = malloc( strlen( urlEncoded ) + strlen( param ) + 2 );
strcpy( postData, param );
strcat( postData, "=" );
strcat( postData, urlEncoded );
curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDS, postData);
curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 );
CURLcode success = curl_easy_perform( curlHandle );
if ( success != 0 ) {
sprintf( receivedStr, "libcurl error: %d", success );
}
free( postData );
curl_free( urlEncoded );
curl_easy_cleanup( curlHandle );
}
}
2009年4月8日水曜日
10
- 11. SSLを使った通信
URLはhttps://…を指定
void https( const char* url, char *receivedStr ) {
オプションの指定
buffer = receivedStr;
buffer[0] = 0;
後者は自己署名のサイトで
CURLcode cc = curl_global_init( CURL_GLOBAL_ALL );
もエラーにならなくなる
if ( cc == 0 )
{
CURL *curlHandle = curl_easy_init();
curl_easy_setopt( curlHandle, CURLOPT_URL, url );
curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback );
//
curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0L);
//
curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 );
CURLcode success = curl_easy_perform( curlHandle );
if ( success != 0 ) {
sprintf( receivedStr, "libcurl error: %d", success );
}
curl_easy_cleanup( curlHandle );
}
}
2009年4月8日水曜日
11
- 12. 認証が必要なWebサイト
void httpAuth( const char* url, const char* username, const char* password, char *received
buffer = receivedStr;
buffer[0] = 0;
認証情報はユーザ名とパス
CURLcode cc = curl_global_init( CURL_GLOBAL_ALL );
ワードをつなげて指定
if ( cc == 0 )
{
CURL *curlHandle = curl_easy_init();
curl_easy_setopt( curlHandle, CURLOPT_URL, url );
curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback );
char *authInfo = malloc( strlen( username ) + strlen( password ) + 2 );
strcpy( authInfo, username );
strcat( authInfo, ":" );
strcat( authInfo, password );
curl_easy_setopt( curlHandle, CURLOPT_USERPWD, authInfo );
curl_easy_setopt( curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST|CURLAUTH_BASIC);
curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 );
CURLcode success = curl_easy_perform( curlHandle );
if ( success != 0 ) {
sprintf( receivedStr, "libcurl error: %d", success );
}
curl_easy_cleanup( curlHandle );
free( authInfo );
}
}
2009年4月8日水曜日
12