در قسمت قبل به ایجاد یک کلاینت http ساده و ارسال یک درخواست با متد get پرداختیم.
در این قسمت به موارد کامل تر و جزیی تر کلاینت http میپردازیم.
برای انجام تمرین های این قسمت از یک api تستی که جهت یادگیری ساخته شده است استفاده میکنیم (شما میتوانید از هر api یا سروری استفاده کنید حتی سرور http که خودتان نوشته باشید.)
در این آموزش ما از api زیر استفاده میکنیم: api docs
5.9.1 نوع درخواست های یک سرور http #
یکی از مواردی که حین اتصال به یک سرور http باید مورد توجه قرار بگیرد متد یا نوع درخواست است.
انواع متد ها: GET : پیام هایی که در این روش ارسال میشوند تنها برای دریافت اطلاعات از سرور میباشد.
POST : در این نوع پیام ها اطلاعاتی برای ثبت شدن در سرور به سمت سرور http ارسال میشود
PUT : در این روش برای جایگزاری مقداری در سرور اطلاعاتی ارسال میشود.
DELETE : از این روش برای حذف مقداری از روی سرور استفاده میشود
PATCH : این روش برای ویرایش جزیی استفاده میشود.
این موارد ۵ تا از پرکابرد ترین نوع درخواست های http هستند.
5.9.2 نوع پاسخ های یک سرور http #
در پاسخ یک سرور http یکی از موارد پر اهمیت کد وضعیت یا status code است. این کد ها اعدادی بین ۱۰۰ تا ۵۹۹ هستند که نشان دهنده وضعیت درخوایت از سمت سرور میباشند.
انواع کد وضعیت: 1XX: این دسته از کد های وضعیت نمایانگر اطلاعات درخواست هستند
2XX: این دسته از کد های وضعیت نمایانگر موفقیت درخواست در ارسال ثبت یا ویرایش اطلاعات میباشد
3xx: این دسته از کد های نشانگر ریدایرکت میباشد
4xx: این دسته از کد ها نشانگر ارور از سمت کلاینت میباشند
5xx: این دسته از کد های نشانگر ارور از سمت سرور میباشند
در قسمت های بعد به پیاده سازی کلاینت و سرور HTTP خواهیم پرداخت و شاهد این موارد در عمل خواهید بود.
در قسمت زیر فهرست تعدادی از کد های وضعیت پرکاربرد را میبینیم:
- 200 ok : این کد وضعیت نشانگر موفقیت در پاسخ به متد GET است
- 404 NotFound : این کد وضعیت نشانگر پیدا نشدن مقدار درخواستی کاربر در سرور است که یکی از معروف ترین کد های وضعیت است
- 500 InternalServerError: این کد وضعیت نشانگر خطای فنی از سمت سرور است
- 401 Unauthorized : این کد وضعیت نشانگر این است که درخواست ارسال شده نیاز به احراز هویت دارد
- 403 Forbidden : این کد وضعیت نشانگر این است که دسترسی به URL مورد نظر نیازمند سطح دسترسی متفاوتی است(این مورد با ۴۰۱ متفاوت است)
5.9.3 GET request #
در مرحله اول به ایجاد یک درخواست GET به سرور میپردازیم.
1package main
2
3import (
4 "fmt"
5 "io/ioutil"
6 "net/http"
7)
8
9func main() {
10 // به url مورد نظر برای دریافت لیست محصولات موجود یک درخوایت با متد GET ایجاد میکنیم
11 resp, err := http.Get("https://fakestoreapi.com/products")
12 if err != nil {
13 fmt.Println("Error:", err)
14 return
15 }
16 defer resp.Body.Close()
17
18 // کد وضعیت پاسخ سرور را چاپ میکنیم
19 fmt.Println(resp.StatusCode)
20
21 // خروجی را در یک اسلایس ذخیره میکنیم
22 body, err := ioutil.ReadAll(resp.Body)
23 if err != nil {
24 fmt.Println("Error:", err)
25 return
26 }
27
28 // خروجی را چاپ میکنیم
29 fmt.Println(string(body))
30}
خروجی:
1
2[
3{
4"id":1,
5"title":"Fjallraven - Foldsack No. 1 Backpack, Fits 15 Laptops","price":109.95,"description":"Your perfect pack for everyday use and walks in the forest. Stash your laptop (up to 15 inches) in the padded sleeve, your everyday",
6"category":"men's clothing",
7"image":"https://fakestoreapi.com/img/81fPKd-2AYL._AC_SL1500_.jpg",
8"rating":{"rate":3.9,"count":120}
9},
10// .....
11]
5.9.4 POST request #
در مرحله بعد با استفاده از متد POST یک محصول جدید به سرور اضافه میکنیم.
1package main
2
3import (
4 "bytes"
5 "fmt"
6 "net/http"
7)
8
9func main() {
10 url := "https://fakestoreapi.com/products"
11 // جیسان مورد نظر برای ارسال و ثبت در سرور را ایجاد میکنیم (مقادیر مورد نیاز در مستندات api ذکر میشود)
12 jsonStr := []byte(`
13 {
14 title: 'test product',
15 price: 13.5,
16 description: 'lorem ipsum set',
17 image: 'https://i.pravatar.cc',
18 category: 'electronic'
19 }
20 `)
21
22 // یک درخواست یه ادرس سرور میسازیم
23 req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
24 if err != nil {
25 fmt.Println(err)
26 }
27
28
29 client := &http.Client{}
30 // درخواست را انجام میدهیم
31 resp, err := client.Do(req)
32 if err != nil {
33 fmt.Println(err)
34 }
35 defer resp.Body.Close()
36
37 // کد وضعیت و پاسخ سرور را چاپ میکنیم
38 fmt.Println("Status:", resp.Status)
39 fmt.Println("Response:", resp)
40}
در صورت برابر بودن کد وضعیت با ۲۰۰ محصول ایجاد شده توسط شما با موفقیت ثبت شده است.
5.9.5 DELETE request #
در مرحله بعد به ایجاد یک درخواست DELETE و پاک کردن یک محصول از سرور میپردازیم:
1package main
2
3import (
4 "fmt"
5 "net/http"
6)
7
8func main() {
9 // شماره محصول مورد نظر را در انتهای url اضافه میکنیم (طبق مستندات)
10 url := "https://fakestoreapi.com/products/1"
11 // یک درخواست با متد DELETE ایجاد میکنیم
12 req, err := http.NewRequest("DELETE", url, nil)
13 if err != nil {
14 fmt.Println(err)
15 }
16 client := &http.Client{}
17 // درخواست را به سرور ارسال میکنیم
18 resp, err := client.Do(req)
19 if err != nil {
20 fmt.Println(err)
21 }
22 defer resp.Body.Close()
23 // درصورت موفقیت آمیز بودن درخواست خروجی عدد 200 است
24 fmt.Println("Status:", resp.Status)
25}
5.9.6 PUT request #
در مرحله بعد به ایجاد یک درخواست PUT و اپدیت کردن اطلاعات یک محصول میپردازیم:
1package main
2
3import (
4 "bytes"
5 "fmt"
6 "net/http"
7)
8
9func main() {
10 // ایدی محول مورد نظر را به انتهای url اضافه میکنیم
11 url := "https://fakestoreapi.com/products/7"
12
13 // مقدار های جدید را برای اپدیت شدن وارد میکنیم
14 requestBody := []byte(`
15 {
16 title: 'test product',
17 price: 13.5,
18 description: 'lorem ipsum set',
19 image: 'https://i.pravatar.cc',
20 category: 'electronic'
21 }
22 `)
23 // درخواست را ایجاد میکنیم
24 req, err := http.NewRequest("PUT", url, bytes.NewBuffer(requestBody))
25 if err != nil {
26 fmt.Println(err)
27 return
28 }
29
30
31 client := &http.Client{}
32 // درخواست را به سرور ارسال میکنیم
33 resp, err := client.Do(req)
34 if err != nil {
35 fmt.Println(err)
36 return
37 }
38 defer resp.Body.Close()
39
40 // درصورت 200 بودن کد وضعیت اپدیت با موفقیت انجام شده.
41 fmt.Println(resp.StatusCode)
42}