ทำ API ด้วยไพธอนง่ายนิดเดียว โดยใช้ Flask (ที่เหลือยากหมด) Ep.1
สำหรับบทความนี้จะเป็นการทำความรู้จักและพัฒนา API เบื้องต้น ด้วยภาษาไพธอน โดยใช้ Flask (Python Web Framework) กันครับ โดยจะเป็นการทดสอบสร้างข้อมูลขึ้นมา และก็ทำการดึงข้อมูลมาแสดงผลครับ
ลองสังเกตภาพด้านบนนี้เป็นข้อมูลสภาพอากาศที่ผมได้นำมาแสดงผลในเว็บไซต์ที่ผมได้ทดลองสร้างขึ้นมา ทุกท่านสงสัยไหมครับว่าผมสร้างข้อมูลเหล่านี้ผมสร้างเซอร์วิสของผมขึ้นมาเองหรือไม่ จินตนาการไม่ออกเลยว่าต้องใช้เวลานานเท่าไหร่ ต้องใช้เซนเซอร์วัดข้อมูลทั่วโลก แล้วดึงข้อมูลเข้ามาในฐานข้อมูล หรือใช้ดาวเทียมในการวัดข้อมูลสภาพอากาศ เพียงแค่คิดผมก็อาจจะแก่ตายก่อนพอดีก่อนที่เว็บไซต์ผมจะสำเร็จมีข้อมูลสภาพอากาศประเทศนั้นประเทศนี้มาแสดงผลในเว็บ แน่นอนครับคำตอบที่ได้คือ ไม่ใช่อย่างแน่นอน ซึ่งผมจะสร้างขึ้นมาทำไมในเมื่อมีคนทำมาให้แล้ว ผมก็แค่ไปขอเขาใช้บริการ ซึ่งข้อมูลสภาพอากาศจากเว็บไซต์ด้านบนผมก็เรียกใช้งาน Service ของ openwhethermap ซึ่งเขาก็เปิดให้ใช้ฟรี ถ้า Transaction ไม่เยอะ
และแน่นอนครับว่าเทคโนโลยีที่จะนำมาใช้ในการสนองความต้องการของเราตรงนี้เรียกว่า API(Application Program Interface)
(Update) — แนะนำคลิปสำหรับเรียน Python REST APIs (ด้วย Flask Framework) 2 ชั่วโมงเต็ม
ซึ่งการทำ APIs ก็เหมือนกับเราสร้าง Service ขึ้นมาจะใช้เองหรือไม่ก็เปิดให้คนอื่นเรียกใช้ Service ของเราได้ ส่วนจะให้ใช้ได้ในระดับไหนก็อยู่ที่เราจะดีไซน์ไว้แบบไหน ก็เหมือนด้านบนที่ openwhethermap เปิดให้ผมเรียกใช้งานเพื่อดึงข้อมูลสภาพอากาศ
ลองไปดู 50 อันดับ APIs ที่ได้รับความนิยมสูงสุดในปี 2020 จากเว็บไซต์ rapidapi.com กันได้เลยครับ เผื่ออยากจะเรียกใช้งานตัวที่น่าสนใจ
Top 50 Most Popular APIs on RapidAPI (2020)
ส่วน API ที่เราจะทำในวันนี้ก็คือ REST APIs ซึ่งจะมีเมธอดต่าง ๆ ซึ่งจะสัมพันธ์กันกับ HTTP Methods เมธอดก็เปรียบเสมือนแอคชั่นหรือการกระทำที่เรากำหนดไว้ว่าจะให้ฝั่ง Client ทำอะไรกับ Resources ของเรา แล้วจะให้ Server ทำการ Response กลับไปในรูปแบบไหน
โดยผมจะยกตัวอย่าง Resource ในที่นี้คือบทความในเว็บไซต์ Medium ที่ผมกำลังเขียน Blog อยู่ในตอนนี้
เมื่อทุกท่านกดเข้ามาอ่านบทความอันนี้ก็คือเมธอด GET คือจะอ่านหรือดูได้อย่างเดียวไม่สามารถไปเปลี่ยนแปลงข้อมูลที่อยู่ในบทความของผม(Resources)ได้
ให้ลองสังเกตที่วงกลมสีส้มด้านบนจะเห็นปุ่มแชร์ไปที่โซเชียลมีเดีย่ต่าง ๆ อันนี้ Medium ก็ไม่ได้สร้าง Service นี้เอง แต่จะเป็นการเรียกใช้งาน Services ของ Twitter, Linkedin และ Facebook ตามลำดับ
ส่วน HTTP Methods มีอะไรบ้าง ผมก็จะยกตัวอย่างมาให้ Methods หลัก ๆ ที่ถูกใช้บ่อย ๆ ดังนี้
GET
เมธอดนี้ Client ทำการร้องขอข้อมูล (Request) เข้ามา โดยสามารถอ่านหรือดูข้อมูลใน Resources นั้นได้อย่างเดียว จะไม่สามารถทำอะไรให้ Resources เกิดการเปลี่ยนแปลงของข้อมูลได้ ถ้ามีการร้องขอข้อมูลเข้ามา แล้ว Match กับ Resources ที่มีอยู่ ตัวเว็บเซิร์ฟเวอร์ก็จะรีเทิร์น STATUS 200 เพื่อบอกว่ามีการเรียกดูข้อมูลใน Resources สำเร็จ หรือถ้าข้อมูลใน Resources นี้ไม่มีหรือถูกลบออกไปแล้ว ก็จะรีเทิร์น STATUS 404 Not Found เป็นต้น
อ่านเพิ่มเติม HTTP response status codes
POST
เมธอดนี้ Client สามารถบันทึกหรือทำให้ Resource ของผมเกิดการเปลี่ยนแปลงได้ เช่นเพิ่มข้อมูล ตัวอย่างง่าย ๆ เช่นอย่างการบันทึกข้อมูลในฟอร์ม เมื่อเราเข้าไปเว็บของ Lazada แล้วต้องการสั่งซื้อสินค้า จากนั้นเราก็กรอกข้อมูลการชำระเงินต่าง ๆ นั่นแหละคือเมธอด POST เมื่อข้อมูลที่เรากรอกถูก Submit ตัวเว็บเซิร์ฟเวอร์จะรีเทิร์น STATUS 201 เพื่อบอกว่ามีการสร้างข้อมูลใหม่เข้ามาใน Resources ซึ่งเมื่อสังเกตดูที่ url ที่เว็บบราวเซอร์ เราจะไม่เห็นข้อมูลหรือพารามิเตอร์ต่าง ๆ ก็จะถูกซ่อนไว้ ซึ่งถ้าเป็นเมธอด GET ข้อมูลเหล่านั้นจะแสดงออกมาให้เห็นหมด ดังนั้นถ้ามีการทำ Transaction ต่าง ๆ ที่ต้องมีการบันทึกข้อมูล จึงควรต้องใช้เมธอด POST
PUT
เมธอดนี้ Clients สามารถแก้ไขหรืออัพเดตข้อมูล ใน Resources ได้ เมื่ออัพเดตข้อมูลสำเร็จ เว็บเซิร์ฟเวอร์ก็จะรีเทิร์น STATUS 200
DELETE
เมธอดนี้ Clients สามารถลบข้อมูลใน Resources ได้ ซึ่งสมมติว่ามีการลบข้อมูลออกไปแล้วโดยเมธอด DELETE นี้ เมื่อเข้ามาที่ url เดิม ก็จะพบกับ STATUS 404 Not Found
เมื่อสังเกตให้ดีจะพบว่า Methods ทั้ง 4 ที่ได้อธิบายไปนั้นมันค่อนข้างที่จะสัมพันธ์กันกับ CRUD (Create, Read, Update, Delete) ซึ่งเมธอดที่คุ้นเคยกันดีและถูกใช้บ่อยที่สุดคือ GET และ POST
ทีนี้ก็กลับมาเข้าเรื่องเฟรมเวิร์คกันต่อเลยครับ
แน่นอนครับว่าพระเอกในบทความนี้จะเป็นใครไปไม่ได้นอกจาก Flask สุดยอดเว็บเฟรมเวิร์คสาขา 2 ของไพธอน รองจาก Django ที่ผมชอบเรียกใช้บริการอยู่บ่อย ๆ ซึ่ง 2 ตัวนี้เป็นที่นิยมสูงสุดในส่วนของเว็บเฟรมเวิร์คในภาษาไพธอน ตามลำดับ เอาจริง ๆ จะว่าไปแล้วไพธอนก็มีเว็บเฟรมเวิร์คที่น่าสนใจอยู่อีกหลายตัว ไม่ว่าจะเป็น
และนอกเหนือจากนี้ยังมีอีกหลายตัว เอาเป็นว่าเลือกคลิ๊กเข้าไปดูเผื่ออาจจะเจอบางตัวที่ตัวที่โดนใจเราก็ไม่แน่ครับ
และชาร์จด้านล่างก็คืออันดับความนิยมของเว็บเฟรมเวิร์คของภาษาไพธอน จากผลสำรวจโดย Jetbrains บริษัทผู้พัฒนา IDEs รายใหญ่ของโลก ซึ่งตัว IDE ที่เราคุ้นเคยกันดีก็อย่างเช่น PyCharm ก็เป็นของ Jetbrains
มาเริ่มทำ API กันเลยครับ
ต้องขอบอกว่าการทำ APIs ด้วย Flask นั้นก็สะดวก ง่าย และทำได้อย่างรวดเร็ว ไม่เปลืองทรัพยากรอะไรมากมาย ซึ่งมันก็ค่อนข้าง Lightweight ดังคอนเซ็ปต์ไมโครเฟรมเวิร์คของ Flask เลยครับ ซึ่ง Flask ก็มีคุณสมบัติครบตามที่เว็บเฟรมเวิร์คควรจะมีเลย หลัก ๆ นั่นก็คือการจัดการกับ Request ที่เข้ามาจากฝั่ง Client และมีการ Response และหรือไม่ว่าจะเป็นการ Render Template ออกไปที่หน้า HTML ก็มีครบแน่นอนอยู่แล้วตามแบบฉบับของเว็บเฟรมเวิร์ค
ปล.ในบทความนี้ผมจะไม่ขอพูดถึงการสร้างโปรเจคท์ด้วย Flask เอาเป็นว่าผมจะคาดหวังไว้แล้วว่า เมื่อทุกท่านเข้ามาอ่านบทความถึงตอนนี้ คงสามารถสร้างโปรเจคท์หรือเข้าใจเกี่ยวกับ Flask มาบ้างแล้ว ถ้ายัง ให้ย้อนกลับไปไล่อ่านบทความที่ผมเคยเขียนไว้อยู่หลายบทความเพื่อทบทวนกันได้เลยครับดังนี้
พัฒนาเว็บแอปพลิเคชันด้วยภาษาไพธอน (Flask Framework)
Python Flask with NGROK(Guideline Series before 101 Official Series)
Flask 101 พัฒนาเว็บด้วยภาษาไพธอน(Flask Framework) Ep.1 เริ่มสร้างโปรเจคท์และ Virtual Environment
Flask 101 พัฒนาเว็บด้วยภาษาไพธอน(Flask Frawework) Ep.2 HTML and CSS
โอเครครับตอนนี้ทุกท่านคงคุ้นเคยกับ Flask กันแล้วล่ะ ผมก็จะขอลุยต่อเลยนะครับ
อันนี้คือหน้า Blueprint ของ Flask ครับ ซึ่งหลายท่านที่เคยเขียน Flask มาจะค่อนข้างคุ้นเคยกับโค้ดนี้กันอยู่แล้ว
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello World"
if __name__ == "__main__":
app.run(debug=True)
จากนั้นไม่รอช้า รันเซิร์ฟเวอร์ทดสอบกันก่อนได้เลย โดยใช้คำสั่งที่เราคุ้นเคยกันดีในการรันไพธอน
python app.py
ซึ่ง app.py ก็คือชื่อไฟล์ที่เรากำลังเขียนโปรแกรมอยู่ในตอนนี้
ถือว่าการทดสอบ Request/Response ออกไปที่หน้าเว็บเพจไม่มีปัญหา
จากนั้นครับ ผมจะทำการสร้างข้อมูลขึ้นมาเพื่อทดสอบในบทความนี้ โดยจะเก็บในรูปแบบ List ที่มีชื่อว่า data แล้วใน List ก็จะเก็บแยกเป็น Dictionary เพื่อเก็บข้อมูลเฉพาะของแต่ละเว็บเฟรมเวิร์ค ในรูปแบบของ {‘Key’: ‘Value’}โดยข้อมูลก็จะมีดังนี้
data = [
{
"id": 1,
"frameworks": "Django",
"year": 2005
},
{
"id": 2,
"frameworks": "Flask",
"year": 2010
},
{
"id": 3,
"frameworks": "Web2Py",
"year": 2007
}
]
ซึ่งข้อมูลเหล่านี้ที่จะถูก Response กลับไปที่ฝั่ง Clients ก็ควรจะเป็นรูปแบบของ JSON(JavaScript Object Notation) ซึ่งเป็นมาตรฐานการรับส่งข้อมูล ซึ่งน่าจะได้รับความนิยมสูงสุดอย่างไม่มีข้อสงสัยในปัจจุบัน ซึ่งแน่นอนครับว่าเราก็จะต้องทำการแปลงข้อมูลที่อยู่ใน List ของเราที่เก็บไว้ในตัวแปร data ไปเป็น JSON ซึ่งตรงนี้ก็ไม่ยุ่งยากเลย ง่ายมาก ๆ เพราะ Flask มีฟังก์ชันที่มีชื่อว่า jsonify มาพร้อมให้เราใช้งานเสร็จสรรพ ก็แค่อิมพอร์ตเข้ามาใช้ได้เลย
from flask import Flask, jsonify
จากนั้นทำการเขียนฟังก์ชันและสร้าง route ขึ้นมาใหม่ ให้สังเกตที่ url ผมจะทำการเพิ่มพาร์ทเข้ามาชื่อว่า api ซึ่งชื่อนี้สามารถจะตั้งเป็นอะไรก็ได้ ตามใจชอบ แต่ผมสร้างขึ้นมาให้รู้ว่าอันนี้คือเราจะเรียกใช้งาน api และนี่ก็เรียกได้ว่าเป็น Best Practice กันเลยครับ โดยตัวเมธอดใน url ก็จะเป็นเมธอด GET นั่นก็คือ Clients สามารถเรียกดูข้อมูลหรือ Resource นี้ได้เท่านั้น ไม่สามารถทำอะไรกับ Resource ที่อยู่ใน url นี้ โดยข้อมูลที่อยู่ในนี้ก็คือข้อมูลของเฟรมเวิร์คต่าง ๆ ที่ผมได้กำหนดในตัวแปร data นั่นเอง
@app.route('/api', methods=['GET'])
def get_api():
return jsonify(data) # Return web frameworks information
จากนั้นผมก็สร้างฟังก์ชันที่มีชื่อว่า get_api เพื่อแม็ปเข้ากับตัว url ที่ผมได้สร้างข้างบน เมื่อ Clients มีการ Request หรือร้องขอเข้ามาที่ url นี้ ก็จะให้ทำในฟังก์ชันนี้ ซึ่งสิ่งที่ทำในฟังก์ชันนี้คือการรีเทิร์นข้อมูล data ออกไปที่ฝั่ง Clients ซึ่ง
การตั้งชื่อฟังก์ชันควรตั้งให้สื่อความหมายตามจุดประสงค์ของฟังก์ชันนั้น ในที่นี้ฟังก์ชันมีชื่อว่า get_api ก็หมายถึง Clients ที่ได้เรียกใช้ API นี้จะสามารถดูข้อมูลได้เท่านั้นไม่สามารถเปลี่ยนแปลงข้อมูลใน Resources ใหม่ได้
Final Code
from flask import Flask, jsonify
app = Flask(__name__)
data = [
{
"id": 1,
"frameworks": "Django",
"year": 2005
},
{
"id": 2,
"frameworks": "Flask",
"year": 2010
},
{
"id": 3,
"frameworks": "Web2Py",
"year": 2007
}
]
@app.route('/')
def home():
return "Hello World"
@app.route('/api', methods=['GET'])
def get_api():
return jsonify(data) # Return web frameworks information
if __name__ == "__main__":
app.run(debug=True)
ทำการรันเซิร์ฟเวอร์ แล้วเข้าไปใน url ที่ได้กำหนดไว้ใน @app.route ซึ่งก็จะได้ url ตามนี้
ซึ่งก็เข้าไปตาม url นี้เลย
ดีใจด้วยครับ เพียงเท่านี้คุณก็ถือว่าได้สร้าง API สำเร็จแล้วในเบื้องต้น ซึ่งก็เป็นการเรียกดูหรือ GET ข้อมูล อันนี้ก็คือในระดับที่เบสิคที่สุด ซึ่งจริง ๆ แล้วมันยังมีอีกหลายอย่างมากที่ต้องเรียนรู้ แต่นี่ถือว่าเป็นจุดเริ่มต้นที่ดีครับ จะทำให้เราพอมองภาพออกบ้างแล้ว และสามารถที่จะต่อยอดไปได้ในระดับที่สูงขึ้นไปอีก
ถ้าบทความนี้เป็นประโยชน์ ก็อย่าลืม Clap เพื่อซัพพอร์ตบทความกันได้เลยครับ หรือมีข้อเสนอแนะตรงไหน ก็คอมเมนต์เข้ามาได้ด้านล่างของบทความนี้ได้เลย
ท่านสามารถติดตามพวกเราได้ที่ stackpython ตามช่องทางด้านล่างนี้ได้เลยครับ
Instagram: stackpython
Facebook: stackpython
Website: stackpython.co
YouTube: stackpython
หรือสนใจคอร์ส Python Web Development with Flask อยากสนับสนุนก็ทักเข้ามาได้ที่เฟสบุ๊คแฟนเพจได้เลยครับคอร์สนี้คุ้มยิ่งกว่าคุ้ม หนึ่งในคอร์สที่เต็มใจนำเสนอของเรา
พบกันบทความถัดไปครับกับ กับการสร้าง API ด้วย Flask Ep.2
See ya next article
Sonny STACKPYTHON