تمرين - استخدام معالج مخصص لإنشاء تطبيق
في هذا التمرين، ستتمكن من إنشاء تطبيق بلا خادم وتشغيله باستخدام Go.
دعم التطبيق
ابدأ بدعم التطبيق باستخدام ملحق Azure Functions في تعليمة Visual Studio البرمجية.
- حدد View>Command Palette.
- اختر Azure Functions: Create New Project.
- حدد مجلداً، وعادة ما يكون المجلد الحالي.
- في Select a language، حدد Custom Handler.
- في Select a template for your first function، حدد HttpTrigger.
- أعطِ التطبيق اسماً، مثل hello.
- حدد مستوى تخويل anonymous. يمكنك تغيير ذلك لاحقاً عند الحاجة.
الآن لديك مشروع يبدو كما يلي:
hello/
function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json
إنشاء التطبيق
تتعلق السلسلة التالية من الخطوات بإنشاء تطبيق يمكنه الاستجابة لمشغِّل HTTP.
أنشئ ملفاً يسمى server.go في جذر المشروع.
أعطِ server.go المحتوى التالي:
package main import ( "fmt" "io" "log" "net/http" "os" )تستورد التعليمة البرمجية السابقة جميع المكتبات التي تحتاج إليها لإنشاء تطبيق HTTP والبحث عن متغيرات البيئة.
أضف التعليمة البرمجية التالية بعد عبارات الاستيراد:
func main() { customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT") if !exists { customHandlerPort = "8080" } mux := http.NewServeMux() // mux.HandleFunc("/api/hello", helloHandler) fmt.Println("Go server Listening on: ", customHandlerPort) log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) }يتم استدعاء وظيفة
main()من تلقاء نفسها. يوضح السطر الأول من الكود كيفية قراءته منFUNCTIONS_CUSTOM_HANDLER_PORTمتغير البيئة:customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")بعد ذلك، تتحقق الوظيفة ما إذا كان المنفذ موجوداً أم لا. إذا لم يكن موجوداً، يتم تعيين المنفذ 8080 للوظيفة:
if !exists { customHandlerPort = "8080" }تنشئ التعليمة البرمجية التالية مثيلاً لخادم HTTP:
mux := http.NewServeMux()السطر الأخير ذو الأهمية هو الذي يبدأ الإنصات لمنفذ معين ويشير إلى أنه جاهز لتلقي الطلبات، بالأسلوب
ListenAndServe():log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))دعونا نضيف التعليمة البرمجية المتبقية. أولا ، حدد موقع السطر التالي وقم بإلغاء التعليق عليه:
// mux.HandleFunc("/api/hello", helloHandler)بين عبارات الاستيراد ووظيفة
main()، أضف التعليمة البرمجية التالية:func helloHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if r.Method == "GET" { w.Write([]byte("hello world")) } else { body, _ := io.ReadAll(r.Body) w.Write(body) } }تعيِّن وظيفة
helloHandler()نوع المحتوى علىapplication/json. وتستجيب بعبارة "hello world" أو النص الأساسي المنشور، إن وجد.
تشغيل التطبيق
لقد انتهيت من تأليف التعليمة البرمجية في هذه المرحلة، لكن يتعين عليك إجراء بعض التكوينات لكي يعمل هذا السيناريو. يتعين عليك الإشارة إلى مكان الملف القابل للتنفيذ، حتى يتمكن مضيف Functions من العثور عليه. يتعين عليك أيضاً تكوين التوجيه وتوضيح أن هذا التطبيق يتعامل مع مشغِّلات HTTP وليس أنواع أخرى من عمليات ربط البيانات.
من وحدة طرفية، شغِّل
go build server.goفي جذر المشروع:go build server.goتنشئ هذه الخطوة ملفاً قابلاً للتنفيذ يسمى server على macOS وLinux، أو server.exe على نظام تشغيل Windows.
افتح ملف host.json وابحث عن عنصر
defaultExecutablePathداخل ملفcustomHandler. حدد./serverعلى macOS وLinux، أو.\\server.exeعلى نظام تشغيل Windows.ضمن عنصر
customHandler، أضف عنصرenableForwardingHttpRequestوأعطه القيمةtrue. يجب أن يبدو عنصرcustomHandlerالآن كما يلي:"customHandler": { "description": { "defaultExecutablePath": "./server", "workingDirectory": "", "arguments": [] }, "enableForwardingHttpRequest" : true }من وحدة طرفية، شغِّل
func startفي جذر المشروع. يؤدي إجراء ذلك إلى بدء تشغيل تطبيق Functions.func startفي نهاية المخرجات، سترى مُخرَجاً مشابها لما يلي:
Functions: hello: [GET,POST] http://localhost:7071/api/helloفي أحد المستعرضات، انتقل إلى
http://localhost:7071/api/hello. يجب أن ترى المُخرَج "hello world."
تهانينا! لقد تمكنتَ من تطوير تطبيق بلا خادم في Go.