Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Cocoa勉強会 #33関東

意外に楽に使えるlibcurl
新居雅行
nii@msyk.net

2009年4月8日水曜日

1
Agenda

•
•
•

2009年4月8日水曜日

curlとlibcurlの紹介
libcurlの使い方
プログラムの実例

2
curlとlibcurlとは

•

cURL and libcurl

•
•
•
• curlコマンド
•
•
• libcurl
•

オープンソースの通信ツール
Client for URLs or Client for URL Req...
libcurlについて

•

URLを指定した通信機能を提供

•
•
•
•

•
•

スレッドセーフ、IPv6対応したライブラリ
バージョンを重ねてかなりの高機能に
ドキュメントが充実している

Mac OS Xには標準搭載
APIはC...
プロジェクトでliburlを使う

•
•

プロジェクトにlibcurlへの参照を作る
ヘッダには、以下のように記入するのみでOK

•

2009年4月8日水曜日

#import <curl/curl.h>

5
libcurlの参照

•
•

プロジェクトに新しく
ファイル加える
/usr/libにあるライブラ
リを追加

•
•
2009年4月8日水曜日

libcurl.4.dylib以外は全部
これへのシンボリックリ
ンク
いずれも4つのアーキ...
ライブラリの番号とバージョン

•

libcurl.n.dylibの「n」はライブラリの番号

•
•
•
•
•
•
•
libcurl最新版(Mac OS X 10.5.6)
•
•
•

libcurlでは、apacheのモジュールの番...
プログラムのポイント

•

基本的には何でも以下の手順でOK

(1) 初期化してハンドルを得る
(2) URLを教える
(3) その他のパラメータを設定(オプション設定)
(4) 実行する
(5) 後始末

•

データの受信

•
•

...
char *buffer;

URLへの単純なアクセス

size_t receivedCallback( void *ptr, size_t size, size_t nmemb, void *stream)	
{
	 int endPoin...
HTTPのポスト
void httpPost( const char* url, const char* postStr, char *receivedStr )	 {
	 buffer = receivedStr;
	 buffer[0] =...
SSLを使った通信
URLはhttps://…を指定
void https( const char* url, char *receivedStr )	 {
オプションの指定
	 buffer = receivedStr;
	 buffer[0...
認証が必要なWebサイト

void httpAuth( const char* url, const char* username, const char* password, char *received
	 buffer = receiv...
CURLOPT_VERBOSE

2009年4月8日水曜日

13
まとめとURL

•
•
•
•

簡単に使えるlibcurl
Cでの文字列処理はちょっと面倒
動作の原理を知ればCURLHANDLEも便利
URLs

•
•
•
•

cURL and libcurl
http://curl.haxx.se...
Nächste SlideShare
Wird geladen in …5
×

Cocoa勉強会#33-意外に楽に使えるlibcurl

4.554 Aufrufe

Veröffentlicht am

Cocoa勉強会#33
2009/4/11
意外に楽に使えるlibcurl
新居雅行

Veröffentlicht in: Technologie
  • I can advise you this service - ⇒ www.WritePaper.info ⇐ Bought essay here. No problem.
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Sex in your area is here: ❶❶❶ http://bit.ly/369VOVb ❶❶❶
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/369VOVb ♥♥♥
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Gehören Sie zu den Ersten, denen das gefällt!

Cocoa勉強会#33-意外に楽に使えるlibcurl

  1. 1. Cocoa勉強会 #33関東 意外に楽に使えるlibcurl 新居雅行 nii@msyk.net 2009年4月8日水曜日 1
  2. 2. Agenda • • • 2009年4月8日水曜日 curlとlibcurlの紹介 libcurlの使い方 プログラムの実例 2
  3. 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
  4. 4. libcurlについて • URLを指定した通信機能を提供 • • • • • • スレッドセーフ、IPv6対応したライブラリ バージョンを重ねてかなりの高機能に ドキュメントが充実している Mac OS Xには標準搭載 APIはC言語だが、さまざまな言語で利用できる • • 2009年4月8日水曜日 オープンソース 例えばPHPやJavaなど CocoaクラスのCURLHANDLE(NSURLHandleのサ ブクラス)もあるが、フルスペックではない 4
  5. 5. プロジェクトでliburlを使う • • プロジェクトにlibcurlへの参照を作る ヘッダには、以下のように記入するのみでOK • 2009年4月8日水曜日 #import <curl/curl.h> 5
  6. 6. libcurlの参照 • • プロジェクトに新しく ファイル加える /usr/libにあるライブラ リを追加 • • 2009年4月8日水曜日 libcurl.4.dylib以外は全部 これへのシンボリックリ ンク いずれも4つのアーキテ クチャをサポート 6
  7. 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
  8. 8. プログラムのポイント • 基本的には何でも以下の手順でOK (1) 初期化してハンドルを得る (2) URLを教える (3) その他のパラメータを設定(オプション設定) (4) 実行する (5) 後始末 • データの受信 • • 2009年4月8日水曜日 コールバック関数を規定に従って定義 関数をパラメータとして指定 8
  9. 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. 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. 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. 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
  13. 13. CURLOPT_VERBOSE 2009年4月8日水曜日 13
  14. 14. まとめとURL • • • • 簡単に使えるlibcurl Cでの文字列処理はちょっと面倒 動作の原理を知ればCURLHANDLEも便利 URLs • • • • cURL and libcurl http://curl.haxx.se/ CURLHANDLE 2009年4月8日水曜日 http://code.google.com/p/curlhandle/ 14

×