APIs คืออะไร?

เคยสงสัยมั้ยครับว่า App ที่ไม่ได้เข้าหน้าเว็บโดยตรงสามารถดึงข้อมูลจากเว็บไซต์มาได้ยังไง? คำตอบก็คือ APIs ครับ

Client หรือส่วนของผู้ใช้จะทำหน้าที่ request ขอข้อมูลโดยใช้มาตรฐานตามแต่เว็บนั้นๆจะอนุญาติให้ใช้

เช่น ถ้าผมต้องการดึงข้อมูลจาก Twitter ผมก็จะเข้าไปดูในเอกสารของ Twitter โดยตรง ที่นี่

ถ้าผมอยากได้ Status บนไทม์ไลน์ผมจะต้องรีเควสต์ไปตามนี้

GET statuses / home_timeline

แล้ว Twitter ก็จะคืนข้อมูลตามที่ผมต้องการกลับมา ประมาณนี้ครับ


เริ่มเขียนกันเลย

ผมจะเอา project basicBlog ที่เคยทำไว้มาทำต่อนะครับ เราจะสร้างระบบ APIs ที่สามารถดึง blog ออกมาจาก blog ของเรา

แต่ก่อนอื่นเราจะต้องติดตั้ง dependencies ที่จำเป็นต้องใช้กันก่อน

pip install django-rest-framework

หลังจากติดตั้งเสร็จถ้าจะใช้งานต้องไป Install ใน settings.py ต่อINSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'rest_framework', #install app
   'blog'
]

เมื่อติดตั้งเสร็จก่อนที่จะเริ่มเขียนกัน เราจะสร้าง app ใหม่ขึ้นมาก่อนสำหรับส่วนของ APIs โดยเฉพาะครับ

python manage.py startapp api

อย่าลืมไป install ใน settings.pyINSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'rest_framework',
   'blog',
   'api'
]

เมื่อเสร็จแล้วเราก็พร้อมที่จะเขียน APIs แล้วครับ


Serializers

อะไรคือ Serializers? สำหรับการที่เราจะขอรีเควสต์ APIs เราจำเป็นจะต้องมีการกำหนด Serializers ไว้ด้วย (ในกรณีที่ Client ส่งข้อมูลไปหา Server ที่นอกเหนือไปจาก GET)

Serializer ถ้าแปลตามตรงตัวแล้วก็คือตัวแปลภาษา เมื่อ Client ส่งข้อมูลอะไรซักอย่างไปที่เครื่อง Server ถ้าเราต้องการจะนำข้อมูลนั้นไปใช้ จะจำเป็นต้องมี Serializer มาแปลก่อนจึงจะนำไปใช้ได้

ก่อนอื่นก็เข้าไปที่แอพ api ก่อน สร้างไฟล์ขึ้นมาไฟล์นึงชื่อ serializers.py (เป็นธรรมเนียมปฎิบัติเพื่อให้จัดการได้ง่าย)from rest_framework import serializers
from blog.models import Blogclass BlogSerializer(serializers.ModelSerializer):
   class Meta:
       model = Blog
       fields = ('title', 'date', 'body')

View

สำหรับหน้า view การใช้ rest framework ก็ไม่ต่างจากหน้าเว็บธรรมดามาก ผมเลือกที่จะสร้างด้วย ModelViewSet โดย ViewSet นี้เป็นเหมือน CBVs ที่จะไปสร้าง endpoint สำหรับการ List, Retrieve, Create, Edit ให้โดยที่เราไม่ต้องมาเขียนเองfrom rest_framework.viewsets import ModelViewSet
from blog.models import Blog
from .serializers import BlogSerializerclass BlogViewSet(ModelViewSet):
   queryset = Blog.objects.all()
   serializer_class = BlogSerializer

Url

เมื่อทำหน้า View เสร็จแล้วเราก็จะต้องชี้ url ไปที่ view ของเรา การชี้ url ผมใช้ตัวช่วยที่มีมาใน rest_framework ชื่อ router โดย router จะนำ ViewSet ของเราไปสร้าง url มาให้เราเองโดยที่เราไม่ต้องมาเขียน url สำหรับ GET, POST เองfrom django.conf.urls import url, include
from django.contrib import admin
from blog.views import blog_list, blog_detail
from api.views import BlogViewSetfrom rest_framework.routers import DefaultRouterrouter = DefaultRouter()
router.register('blog', BlogViewSet)urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^$', blog_list, name='home'),
   url(r'^blog/(?P<pk>\d+)$', blog_detail, name='blog'),
   url(r'^api/', include(router.urls))
]

ทดสอบ

ถ้าเสร็จแล้วก็ลองมาทดสอบกันดูครับ เราสามารถทดสอบได้หลายวิธี โดยการเข้าไปที่ http://localhost:8000/ เองหรือจะใช้โปรแกรมช่วยอย่าง curl หรือ Postman ก็ได้ (ผมใช้ Postman เพราะใช้ง่าย)

ภาพทดสอบ

สำหรับภาพข้างบนนี้คือตอนผมลองรีเควสต์ GET ไปด้วย Postman (ซึ่งก็คือการรีเควสต์ List) ตัว server ก็จะส่งลิสต์ของ blog ที่มีทั้งหมดใน Database มาให้ผม จะเห็นว่า APIs ที่เราเขียนใช้งานได้ครับ

สำหรับรายละเอียดเพิ่มเติมอื่นๆก็สามารถหาอ่านได้ที่เว็บไซต์ของ rest framework ได้เลยครับ www.django-rest-framework.org


สำหรับซีรีส์ Django ก็ถือว่าจบไปแล้วนะครับ กินเวลาหลายเดือนเลยทีเดียว 5555 ขอบคุณทุกท่านที่ติดตามและคอยกด Clap มาตลอดครับ


Medium ที่ 35
ปีนี้ผมตั้งใจว่าจะเขียน Medium ให้ได้เดือนละ 4–5 Medium ครับ สิ้นปีก็จะมี 52 Medium เท่ากับจำนวนสัปดาห์ใน 1 ปีพอดี ไม่รู้จะทำได้มั้ย แต่ก็ถือเป็น Passion เล็กๆน้อยๆของผมครับ 5555
ผมเขียนบทความหลายแนวแล้วแต่ว่าอยากเขียนยังไง ถ้าอยากให้กำลังใจช่วยกด Clap ให้ซักที สองทีด้วยนะครับ :D
เจอกันบทความหน้าครับ