يعد إرسال طلب HTTP مفتاحًا لأي تطبيق يحتاج إلى الاتصال عبر الإنترنت. تعرف على كيفية إرسال مجموعة متنوعة من طلبات HTTP باستخدام Go.
أحد المبادئ الأساسية التي تحكم عمل شبكة الويب العالمية هو تبادل الطلبات والردود. عندما ترسل طلبًا للوصول إلى صفحة ويب ، يستجيب الخادم بالبيانات المناسبة.
تشمل البروتوكولات الشائعة التي تحكم أنواعًا مختلفة من اتصالات الإنترنت HTTP (بروتوكول نقل النص التشعبي)، بروتوكول نقل الملفات (بروتوكول نقل الملفات) ، و SMTP (بروتوكول نقل الايميل البسيط).
HTTP هو البروتوكول الذي ستستخدمه عادةً عند عرض موقع ويب أو استخدام تطبيق ممكن على الويب. يمكنك أيضًا العمل مع طلبات HTTP من العديد من لغات البرمجة ، بما في ذلك Go.
ما هو طلب HTTP؟
يحدد HTTP كيف يقوم العملاء ، مثل متصفحات الويب ، بإرسال الطلبات إلى الخوادم التي تقوم بعد ذلك بإرجاع استجابة. يحتوي طلب HTTP على معلومات حول مورد يحاول العميل الوصول إليه. تشتمل رسالة الطلب عادةً على عنوان URL يحدد المورد والبيانات الاختيارية الأخرى مثل الرؤوس ومعلمات الاستعلام.
هناك عدة أنواع من طلبات HTTP، بما في ذلك GET و POST و PUT و DELETE و HEAD و OPTIONS و CONNECT. الأنواع الأربعة الأولى هي الأكثر شيوعًا ؛ أنها تعكس عمليات CRUD قراءة وإنشاء وتحديث وحذف على التوالي.
غالبًا ما يتم استخدام نوع طلب PUT بالتبادل مع نوع طلب التصحيح. إنهم يحققون نفس الغرض ، لكنهم يختلفون فقط في البيانات التي يتوقعون أن يتضمنها الطلب.
إرسال الطلبات باستخدام أساليب HTTP الشائعة
الذهاب المدمج http طَرد يوفر مجموعة من الوظائف والهياكل التي يمكنك استخدامها لإنشاء خوادم الويب وإدارة طلبات HTTP. إنها حزمة قوية للغاية وجميع أطر عمل Go web تُبنى فوقها بطريقة أو بأخرى. إنها حزمة فرعية من Go’s شبكة طَرد.
لإنشاء طلب HTTP في Go ، يمكنك استخدام ملف http. طلب جديد() وظيفة وتعيين الطريقة المناسبة وعنوان URL والعناوين ونص الطلب. بعد إنشاء الطلب ، يمكنك استخدام زر Go صافي / http الحزمة http. عميل{} هيكل لتشغيله وتلقي الاستجابة.
تستخدم نماذج التعليمات البرمجية التالية reqres.in، واجهة برمجة تطبيقات متاحة للجمهور لاختبار طلبات HTTP. يمكنك استخدامه لاختبار طلبات GET و POST و PUT و DELETE في برامج Go.
طلب POST
الكود أدناه هو وظيفة ترسل طلب POST إلى /api/users نقطة نهاية reqres.in لإنشاء مستخدم جديد باسم ووظيفة.
طَرد رئيسي
يستورد (
"بايت"
"ترميز / json"
"FMT"
"io"
"net / http"
)funccreateUser(الاسم ، الوظيفة خيط) {
FMT. Println ("جاري إنشاء المستخدم ...")apiUrl: = " https://reqres.in/api/users"
بيانات المستخدم: = []بايت("{" الاسم ":" ` + الاسم + ""، "الوظيفة": "` + عمل + `"}`)// إنشاء طلب HTTP جديد
الطلب ، الخطأ: = http. طلب جديد("بريد"، apiUrl ، بايت. NewBuffer (بيانات المستخدم))
طلب. رأس. تعيين("نوع المحتوى", "التطبيق / json ؛ charset = utf-8 ")// أرسل الطلب
العميل: = & http. عميل{}
الاستجابة ، الخطأ: = العميل. هل (طلب)لو خطأ! لا شيء {
FMT. Println (خطأ)
}responseBody ، الخطأ: = io. ReadAll (response. جسم)
لو خطأ! لا شيء {
FMT. Println (خطأ)
}formattedData: = formatJSON (responseBody)
FMT. Println ("حالة: "، إجابة. حالة)
FMT. Println ("نص الاستجابة:"، بيانات منسقة)
// تنظيف الذاكرة بعد التنفيذ
تأجيل إجابة. جسم. يغلق()
}
التنسيق هي وظيفة مخصصة يمكنك كتابتها لتنسيق بيانات الإخراج. إليك كيفية تنفيذه:
// وظيفة لتنسيق بيانات JSON
funcالتنسيق(بيانات []بايت)خيط {
فار بايت. متعادل
يخطئ: = json. مسافة بادئة (& إخراج ، بيانات ، "", " ")لو يخطئ! لا شيء {
FMT. Println (يخطئ)
}
د: = الخروج. بايت ()
يعودخيط(د)
}
يمكنك استدعاء createUser () تعمل في برنامج مثل هذا:
funcرئيسي() {
FMT. Println ("جارٍ إجراء طلب POST ...")
createUser ("تيم أومولانا", "كاتب")
}
عند تشغيل البرنامج في محطة طرفية ، باستخدام ملف اجري الأمر ، سترى الإخراج مثل هذا:
طلب الحصول على
الكود التالي هو وظيفة ترسل طلب GET لاسترداد مستخدم من خادم reqres.in باستخدام معرفه الفريد.
// main.go
funcgetUser(بطاقة تعريف خيط) {
FMT. Println ("الحصول على المستخدم حسب المعرف ...")// تقديم طلب GET إلى API للحصول على المستخدم حسب المعرف
apiUrl: = " https://reqres.in/api/users/" + معرف
الطلب ، الخطأ: = http. طلب جديد("يحصل"، apiUrl ، لا شيء)لو خطأ! لا شيء {
FMT. Println (خطأ)
}طلب. رأس. تعيين("نوع المحتوى", "التطبيق / json ؛ charset = utf-8 ")
العميل: = & http. عميل{}
الاستجابة ، الخطأ: = العميل. هل (طلب)لو خطأ! لا شيء {
FMT. Println (خطأ)
}responseBody ، الخطأ: = io. ReadAll (response. جسم)
لو خطأ! لا شيء {
FMT. Println (خطأ)
}formattedData: = formatJSON (responseBody)
FMT. Println ("حالة: "، إجابة. حالة)
FMT. Println ("نص الاستجابة:"، بيانات منسقة)
// تنظيف الذاكرة بعد التنفيذ
تأجيل إجابة. جسم. يغلق()
}
لا يرسل طلب GET البيانات إلى الخادم ، لذا لا يقبل أو يرسل نص الطلب إلى الخادم عند إجرائه. إليك ما سيبدو عليه مثال استدعاء الوظيفة أعلاه:
funcرئيسي() {
FMT. Println ("جارٍ تقديم طلب GET ...")
getUser ("2")
}
انتاج:
طلب PUT
طلب PUT مشابه جدًا لطلب POST لأنه يرسل أيضًا البيانات إلى الخادم. الاختلاف الرئيسي هو أن POST تنشئ موردًا جديدًا بينما تقوم PUT بتحديث مورد موجود.
فيما يلي تنفيذ لطلب PUT:
// main.go
funcupdateUser(الاسم ، الوظيفة ، المعرف خيط) {
FMT. Println ("تحديث المستخدم ...")// تقديم طلب PUT إلى API لتحديث المستخدم
apiUrl: = " https://reqres.in/api/users/" + معرف
بيانات المستخدم: = []بايت("{" الاسم ":" ` + الاسم + ""، "الوظيفة": "` + عمل + `"}`)// إنشاء طلب HTTP PUT جديد
الطلب ، الخطأ: = http. طلب جديد("يضع"، apiUrl ، بايت. NewBuffer (بيانات المستخدم))
طلب. رأس. تعيين("نوع المحتوى", "التطبيق / json ؛ charset = utf-8 ")
// باقي جسم الوظيفة من دالة createUser ...
// قدم طلبًا ، واحصل على رد ، وقم بمسح الذاكرة ...
}
من هذا الرمز ، يمكنك رؤية الاختلافات الوحيدة بين طلب PUT وطلب POST أعلاه هي اسم الطريقة وعنوان URL. عند استخدام PUT لتحديث البيانات الحالية ، ستحتاج إلى إلحاق المعرف بعنوان URL للطلب. سيبدو نموذج استدعاء لهذه الدالة كما يلي:
func main () {
// تحديث الإدخال بالمعرف 2.
updateUser ("تيم Newname", "كاتب طاقم", "2")
}
يقوم الكود أعلاه بتحديث المستخدم وينتج الإخراج التالي:
حذف طلب
استخدم طريقة الطلب DELETE لإجراء عملية حذف على خادم ويب. طلب حذف يحذف المورد المحدد بواسطة URI. يبدو طلب DELETE في Go كما يلي:
funcمسح المستخدم(بطاقة تعريف خيط) {
FMT. Println ("جارٍ حذف المستخدم ...")
// تقديم طلب DELETE إلى API لحذف المستخدم
apiUrl: = " https://reqres.in/api/users/" + معرف// إنشاء طلب HTTP جديد
الطلب ، الخطأ: = http. طلب جديد("يمسح"، apiUrl ، لا شيء)
طلب. رأس. تعيين("نوع المحتوى", "التطبيق / json ؛ charset = utf-8 ")العميل: = & http. عميل{}
الاستجابة ، الخطأ: = العميل. هل (طلب)
لو خطأ! لا شيء {
FMT. Println (خطأ)
}
FMT. Println ("حالة: "، إجابة. حالة)
}
لا يقبل طلب الحذف ولا يعيد نصًا ، ومن ثم لا توجد حاجة لتحليل أو تنسيق نص طلب JSON والاستجابة. لا تُرجع الاستجابة إلا حالة للإشارة إلى النجاح أو الفشل. إليك ما يبدو عليه نموذج استدعاء للدالة بإخراجها:
funcرئيسي() {
FMT. Println ("جارٍ إجراء طلب الحذف ...")
مسح المستخدم("2")
}
انتاج:
وفر الوقت باستخدام ملف http. بريد() و http. يحصل() طرق من صافي / http حزمة لجعل بريد و يحصل الطلبات مباشرة ، دون الحاجة إلى استخدام طلب جديد() وظيفة و عميل{} هيكل لإنشاء وتقديم الطلب بشكل منفصل. تفحص ال net / http توثيق للمزيد من المعلومات.
عمل طلبات HTTP في تطبيقات Go
ال http توفر الحزمة في Go كل ما يلزم لإجراء طلبات HTTP والتعامل مع الاستجابات في تطبيقات Go. تتيح لك الوظائف والهياكل التي توفرها الحزمة إنشاء أنواع مختلفة من الطلبات وإرسالها مثل GET و POST و PUT و DELETE وغيرها الكثير.
هذا يجعل من السهل إنشاء تطبيقات ويب في Go يمكنها التفاعل مع خدمات الويب وواجهات برمجة التطبيقات الأخرى. طريقة جيدة للحصول عليها يكون الأمر أكثر دراية بإجراء طلبات HTTP في Go من خلال إنشاء تطبيق يقدم طلبات إلى واجهة برمجة تطبيقات REST أخرى من خاصة بك.