user
HTTP in software engineering က ဘာလဲ။ HTTP ကို ကွန်ပျူတာတွေအကြားက ဘာသာစကားလို့ ဘာကြောင့် တင်စားကြတာလဲ။ HTTP နဲ့ REST API တူသလား။


assistant
အင်တာနက် ကွန်ယက်ကြီးထဲမှာ ဖုန်း၊ ကွန်ပျူတာ စသဖြင့် မတူညီတဲ့ device တွေက ဘီလီယံနဲ့ချီပြီး ရှိကြပါတယ်။ ဒီ device တွေအကြား အချင်းချင်း ဆက်သွယ်ဖို့ တူညီတဲ့ language တခုခု ရှိမထားဘူးဆိုရင် ကွန်ယက်ကြီးက သူတလူ ငါတမင်းနဲ့ အမှိုက်ပုံကြီးတခုလို ဖြစ်နေပါလိမ့်မယ်။
HTTP ကို ကျွန်တော်တို့ ဒီရည်ရွယ်ချက်နဲ့ ဖန်တီးခဲ့ကြတာပါ။ ကမ္ဘာရဲ့ ဒီဖက်ခြမ်းမှာရှိတဲ့ ဖုန်းကနေ တခါမှ မမြင်ဖူးတဲ့ ​မြောက်အမေရိကတိုက်က device တခုကို လှမ်းဆက်သွယ်တဲ့အခါ အချင်းချင်း နားလည်ကြဖို့ဆိုရင် ဘယ်လိုအချက်ပြမယ်၊ ဘယ်စကားလုံးက ဘာကိုဆိုလိုပါတယ် စသဖြင့် ကြိုဇာတ်တိုက်ထားရပါလိမ့်မယ်။ ဒါကိုပဲ protocol လို့ခေါ်တာဖြစ်တယ်။
အချင်းချင်း တခါမှမမြင်ဖူးတဲ့ လူနှစ်ယောက် ရုပ်ရှင်ရုံရှေ့ ချိန်းထားကြတယ်လို့ မြင်ယောင်ကြည့်ပါ။ ငါအနီလေး ဝတ်လာခဲ့မယ်။ ငါ့ကိုတွေ့ရင် လက်ထောင်ပြလိုက်၊ ဒါဆို ငါ နင့်ဆီလျှောက်လာခဲ့မယ်လို့ ကြိုညှိထားတယ်လို့ ဆိုပါစို့။ ဒါက protocol ရဲ့သဘောဖြစ်တယ်။ device နှစ်ခုကို စက်ရုံတခုတည်းက ထုတ်ထားတာ ဖြစ်ဖို့ မလိုသလို သူတို့ချင်း ဆက်သွယ်နိုင်ဖို့ သီးသန့် ညှိနှိုင်းစရာလည်း မလိုပါဘူး။ ဒီလိုမျိုး device တိုင်းက နားလည်နိုင်အောင် ကြိုတင် သဘောတူထားတဲ့ protocol တွေထဲမှာမှ HTTP protocol ကတော့ နာမည်အကျော်ဆုံးနဲ့ အင်တာနက်ပေါ် နေရာအယူထားဆုံး protocol တခုဖြစ်တယ်။
HTTP အကြောင်းပြောရင် client - server မော်ဒယ်အတွဲက မပါမဖြစ်ပါပဲ။ device တခုက HTTP protocol ကိုသုံးပြီး နောက်ထပ် device တခုကို ဆက်သွယ်တယ်လို့ ဆိုပါစို့။ စဆက်သွယ်တဲ့ device ကို client လို့ သမုတ်ကြပါတယ်။ မှတ်ထားရမှာက ကိုယ့်ဖက်က စဆက်သွယ်ချင်ရင် ဆက်သွယ်နိုင်ဖို့ လိုအပ်တာတွေကို ပြင်ဆင်ထားရပါမယ်။ ဆက်သွယ်ခံရတဲ့ device ကိုတော့ server လို့သတ်မှတ်ကြပါတယ်။ ဒီနေရာမှာလည်း ခုနကလိုပဲ ဆက်သွယ်ခံချင်ရင် ဆက်သွယ်ခံနိုင်အောင် ပြင်ဆင်ထားဖို့ လိုအပ်ပြန်ပါတယ်။
HTTP ကမ္ဘာမှာ ကိုယ့်ဖက်က စဆက်သွယ်နိုင်ဖို့အတွက် device ပေါ်မှာ HTTP client ရှိထားဖို့ လိုအပ်ပါတယ်။ HTTP client က connection တည်ဆောက်တာနဲ့ စီမံခန့်ခွဲတာ၊ request တည်ဆောက်တာနဲ့ ပေးပို့တာ၊ response ကိုစောင့်ကြည့်ပေးတာ စသဖြင့် တာဝန်ယူပြီး Chrome, Safari, Firefox စတဲ့ Browser တွေက အတွေ့ရများဆုံး HTTP client တွေပဲဖြစ်တယ်။ ဒါတင်မကပဲ terminal ကနေ တိုက်ရိုက်သုံးနိုင်တဲ့ curl စတဲ့ CLI HTTP client တွေရှိသလို Android OS နဲ့အတူ ပါရှိတဲ့ Apache လို Client Library အနေနဲ့လည်း တွေ့ရနိုင်တယ်။
HTTP server အကြောင်း မပြောခင်မှာ server ဆိုတဲ့ အသုံးအနှုန်းအကြောင်း အရင်နားလည်ထားစေချင်ပါတယ်။ software တခုလည်ပတ်ဖို့ လိုအပ်တဲ့ hardware ကို physical host လို့ခေါ်ပြီး အဲဒီ hardware ကို server လို့ခေါ်တယ်။ တခါ server ဆီရောက်လာမယ့် request တွေကို hardware ရဲ့ port တခုခုမှာ မပြတ်စောင့်ကြည့်နေနိုင်ဖို့ software တွေလိုအပ်ပြီး အဲဒီ software တွေကိုတော့ web server လို့ခေါ်ကြပါတယ်။ Apache နဲ့ Nginx တို့က နာမည်ကျော် web server software တွေပေါ့။ ဒါပေမယ့် အဲဒီ web server တွေက ကြားခံသက်သက်သာဖြစ်ပြီး request ကို ဖြည့်ဆည်းပေးနိုင်ဖို့ ရည်ရွယ်တဲ့ အစိတ်အပိုင်းတွေ မဟုတ်ပါဘူး။
တကယ်တမ်း web server တွေဆီက request ကို လက်ခံပြီး စိစစ်ဖြည့်ဆည်းပေးနိုင်ဖို့အတွက်ကတော့ C++ Java PHP စတဲ့ programming language တွေနဲ့ server-side program တွေကိုတည်ဆောက်ရပါတယ်။ ဒီတော့ HTTP ကမ္ဘာမှာ server လို့ပြောရင် ကြားခံဖြစ်တဲ့ Web Server ကလည်း HTTP protocol ကိုနားလည်ဖို့ လိုအပ်သလို server program ကလည်း HTTP ကိုနားလည်ပြီး request တွေဖြည့်ဆည်းပေးနိုင်ဖို့ အရေးကြီးပါတယ်။
ဒီတော့ HTTP protocol ကိုအသုံးပြုပြီး ဆက်သွယ်မှုတခု ပြုလုပ်ခဲ့ရင် ဒါကို request ပို့တယ်လို့ ခေါ်ဝေါ်ကြောင်း သိလောက်ရောပေါ့။ HTTP request တခုမှာ server ပေါ်က ဘယ် resource ကိုဆိုလိုကြောင်း ညွှန်းတဲ့ url နဲ့ အဲဒီ resource ကိုဘာလုပ်ချင်တယ်ဆိုတဲ့ HTTP verb (ဥပမာ GET, POST) တို့ပါဝင်ကြတယ်။ server ဖက်က ဒီ request ကို လက်ခံရရှိတဲ့အခါ စိစစ်ပြီး အကြောင်းပြန်လိုက်တာကို response ပြန်တယ်လို့ ခေါ်တယ်။
အဲဒီ response မှာ တောင်းဆိုလာတဲ့ request က ပြီးမြောက်လား၊ ငြင်းခံရသလား ဒါမှမဟုတ်ပဲ နောက်တနေရာကို ထပ်တောင်းဆိုရမလား စသဖြင့် နားလည်စေမယ့် HTTP Status Code တခု ပါပါမယ်။ browser တွေမှာ မြင်နေရကျ 404 Not Found ဆိုတာ တောင်းဆိုလိုက်တဲ့ resource ကို server မှာရှာမတွေ့တဲ့အတွက် request မအောင်မြင်ပါလို့ အကြောင်းပြန်လိုက်တဲ့ သဘောပါပဲ။ ဒီတော့ request တခု အောင်မြင်သည်ဖြစ်စေ၊ အငြင်းခံရသည်ဖြစ်စေ server ဖက်က response ပြန်ကိုပြန်မှာဖြစ်လို့ request ရဲ့ အခြေအနေကို သိချင်ရင် status code ကိုသာ ဖတ်ရမှာဖြစ်တယ်။
ရှေ့တခေါက်မှာ RESTful API တွေအကြောင်း ကျွန်တော်တို့ ပြောခဲ့ကြပါတယ်။ HTTP protocol ကို device တွေပေါ်က application program တွေကြား အချက်အလက် ဖလှယ်ဖို့အတွက် သုံးတာဖြစ်လို့ HTTP ကို application protocol လို့လည်း ရည်ညွှန်းကြပါတယ်။
ဥပမာ Facebook Mobile App က /posts ဆိုတဲ့ url မှာ GET ဆိုတဲ့ HTTP verb အသုံးပြုပြီး Facebook Server ဆီက post တွေ လှမ်းတောင်းယူနိုင်တယ်။ ဒါပေမယ့် GET အစား DELETE နဲ့ကော post တွေ တောင်းယူနိုင်အောင် Facebook Server က ပြင်ထားပေးလို့ မရဘူးလားလို့ မေးရင် ရပါတယ်လို့ ဖြေရပါလိမ့်မယ်။ ဒါပေမယ့် အဲလို​လုပ်ချင်သလိုသာ လုပ်ကြမယ်ဆိုရင် အင်္ဂလိပ် စကားချင်း အတူတူ တမြို့မှာ အဓိပ္ပါယ်တမျိုး ဆိုသလို ဖြစ်တော့မှာပေါ့။ ဒါကြောင့် REST ရဲ့ အခြေခံ အိုင်ဒီယာက HTTP ကို ကမောက်ကမတွေ မလုပ်ကြပဲ စနစ်တကျ အသုံးပြုကြဖို့ ကြပ်မတ်ထိန်းသိမ်းထားဖို့ ဖြစ်တယ်။
HTTP က application protocol သာဖြစ်တဲ့အတွက် သူ့မှာ program တွေကြား ဖလှယ်ကြတဲ့ အချက်အလက်တွေကို ဘယ်လိုဖော်ပြမယ်ဆိုတဲ့ သတ်မှတ်ချက်တွေတော့ မပါဝင်ပါဘူး။ ဖော်ပြဖို့အတွက် ရွေးချယ်စရာတွေထဲမှာ Json နဲ့ XML နှစ်ခုက လူသုံးအများဆုံးဖြစ်တယ်။ ဥပမာ Facebook Server အနေနဲ့ Facebook App ဆီက /posts အတွက် GET request ကိုလက်ခံရတဲ့အခါ response နဲ့အတူ post တွေ ပြန်ထည့်ပေးမှာဖြစ်တယ်။ ဒါပေမယ့် post တွေကို JSON နဲ့ပေးသလား။ XML နဲ့ပေးမှာလား ဆိုတာကတော့ ကိုယ့်လိုအပ်ချက်နဲ့ ကိုက်အောင် ရွေးချယ်နိုင်တာဖြစ်တဲ့အတွက် ဆန္ဒရှိရင် REST အစား HTTP နဲ့ XML ကိုပူးတွဲအသုံးချတဲ့ SOAP API တွေလည်း တည်ဆောက်နိုင်သေးတယ်။