Cocoa & XML-RPC Protocol

มีนาคม 25, 2008 at 1:15 am ใส่ความเห็น

การพัฒนา Application ที่ติดต่อกับ Web service นั้น ใน Cocoa ก็มีเครื่องมือที่ให้เราสามารถให้เราใช้โดยเฉพาะอยู่แล้ว ก็คือ Core Web Service ที่มีมาตั้งแต่ Mac OS X 10.2 (แม้ว่าบางคนจะไม่ใช้เพราะบอกว่ามันมี Bug ก็ตาม)

ตัวอย่างของ Application ที่ติดต่อกับ Web Service ที่มีให้เห็นชัดเลยก็อย่างเช่น พวกโปรแกรมโพส Blog (อย่างเช่น ecto ที่ใช้อยู่นี้) ที่ช่วยให้เราสามารถโพส Blog ได้โดยที่เราไม่ต้องไปโพสผ่านหน้าเวบให้ลำบากเลย

วันนี้จะนำเสนอการสร้าง Application สำหรับเชื่อมต่อกับ Drupal ซึ่งเป็น CMS ตัวนึงที่ได้รับความนิยมสูงอยู่ทีเดียวในปัจจุบัน
…เกริ่นมานานแล้ว เริ่มเลยละกัน
Drupal เป็น CMS ที่เปิดให้เราสามารถโพส Content ผ่าน Desktop Application ต่างๆ เช่น Ecto (หรือ ตัวที่เรากำลังจะเขียนอยู่นี่เอง) ได้ โดยเราต้องไปทำการ Enable Module ที่ชื่อว่า Blog API ซะก่อน
ตัว Blog API นี้จะเป็น API ก็มี API สำหรับจัดการ Content อยู่ 3 ตัว คือ Blogger, MetaWeblog และ Moveable type รวมๆแล้วเราสามารถเลือกใช้ได้ทั้ง 3 ตัว ขึ้นกับความเหมาะสมของสิ่งที่เราจะโพสขึ้นไปนะครับ
…เอาล่ะ มาถึงส่วนของการ Coding กันแล้ว
ที่ผมจะเขียนคราวนี้ คือการโพส Content ผ่าน MetaWeblog นะครับ สิ่งที่เราต้องรู้มีอยู่ 3 อย่าง นั่นก็คือ
1. Blog ของเรานั้น ไฟล xmlrpc.php อยู่ตรงไหน
2. Method ที่เราใช้นั้นชื่อว่าอะไร
3. Method นั้นมี Parameter อะไรบ้าง


ขั้นแรก เราต้องสร้างตัวแปรขึ้นมาใช้ในการติดต่อครั้งนี้ ดังนีี้


WSMethodInvocationRef
rpcCall;

จากนั้นเราก็ต้องกำหนด
url ดังนี้

NSURL
*rpcURL = [NSURL URLWithString:@”http://My-Drupal/xmlrpc.php”];

จากนั้นทำการกำหนดว่าเราจะใช้
Method อะไรในการทำงานนี้ ซึ่งในการโพส Content นี้เราจะใช้คำสั่ง metaWeblog.newPost เราก็กำหนดในตัวแปร ดังนี้

NSString
*methodName = @”metaWeblog.newPost”;

จากนั้นเราก็ต้องมาดูว่า
method นี้กำหนด Parameter อย่างไร อย่าง newPost มีการกำหนด Parameter ลักษณะนี้

<string>blog_id, <string>username, <string>password, <struct>post, <boolean>publish
*ภายใน<>คือชนิดข้อมูล และภายนอกคือบอกว่าแต่ละ Parameter เป็นอะไร

ตรงส่วนของ Struct ของ Post นั้น ภายในต้องมี Parameter ย่อยข้างในอีกอันนึง ซึ่งมีการกำหนดลักษณะ Parameter ลักษณะนี้

<string>description, <datetime>dateCreated, <string>title
**มี Parameter อื่นๆที่เป็น Option อีก

ซึ่งในส่วนของ Post ที่เป็นโครงสร้างย่อยนี้ เราก็จะสร้างมันเอาไว้ก่อน โดยสร้างไว้เป็น dictionary ดังนี้

NSDate *date = [NSDate date];

NSArray *postKey = [NSArray arrayWithObjects: @”description”, @”dateCreated”, @”title”, nil];
NSArray *postObject = [NSArray arrayWithObjects: @”My description”, date, @”My title”, nil];
NSDictionary *post = [NSDictionary dictionaryWithObjects:postObject forKeys:postKey];
คราวนี้ก็เริ่มกำหนดส่วนของ Web Service ต่อ โดยกำหนด Parameter ของ Method metaWeblog.newPost ตามข้างต้น ดังนี้

NSArray
*keys = [NSArray arrayWithObjects: @”blog_ID” , @”username”, @”password”, @”post”, @”publish”, nil];
NSMutableArray *objects = [NSArray arrayWithObjects: @”blog”, @”admin”, @”*******”, post,
kCFBooleanTrue, nil];

NSDictionary *params = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

จากนั้นก็ต้องสร้าง
Array เพื่อบอกลำดับของ key (อันนี้สำคัญมาก เพราะถ้าไม่บอก มันจะไป generate xml ผิดลำดับ เป็นผลให้ Parameter ผิดพลาด )

NSArray
*order = [NSArray arrayWithObjects: @”blog_ID”, @”username”, @”password”, @”post”, @”publish”, nil];

จากนั้นก็เอา Parameter ทั้งหลายแหล่ที่สร้างไว้มาเข้าสู่กระบวนการเชื่อต่อกับ Web service ซะที เริ่มจาก…
รวม URL เป้าหมายและ Method ที่จะใช้ มาไว้ด้วยกัน ตามนี้

rpcCall =
WSMethodInvocationCreate ((CFURLRef) rpcURL, (CFStringRef) methodName, kWSXMLRPCProtocol);

จากนั้นก็ตามด้วยการเอา Parameter ที่สร้างเมื่อกี้ใส่เข้าไปอีก ดังนี้

WSMethodInvocationSetParameters (rpcCall, (CFDictionaryRef) params, (CFArrayRef) order);

และทำการเชื่อมต่อและเก็บผลลัพธ์ไว้ในตัวแปรด้วย ดังนี้

NSDictionary
*result;
result = (NSDictionary *) (WSMethodInvocationInvoke (rpcCall));

ถ้าโพสได้ Result ที่ส่งกลับมาจะเป็นเลข ID ที่เราโพสขึ้นไปเมื่อกี้นั่นเอง แค่นี้ก็เสร็จแล้วหล่ะครับ

***ง่ายนิดเดียวเอง แต่ผมเสียเวลาไปทั้งวันเลย เหอะๆ
****เรื่อง Cocoa ยังมีอีกตั้ง 2-3 เรื่ิิองแน่ะ แต่แค่จะโพสซักเรื่อง ทำไมมันยากนักก็ไม่รู้เนี่ย ไม่เห็นเหมือนเรื่องส่วนตัวเลย (ฮา)

Entry filed under: Cocoa Programming. Tags: , .

วาทะคานที NSAlert

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  เปลี่ยนแปลง )

Google photo

You are commenting using your Google account. Log Out /  เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out /  เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out /  เปลี่ยนแปลง )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed


del.icio.us For iPhone dev

Post Calendar

มีนาคม 2008
พฤ อา
« ก.พ.   พ.ค. »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

%d bloggers like this: