Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menghantar permintaan yang betul kepada API menggunakan Dio/Flutter (frontend) dan Go (backend)

Cara menghantar permintaan yang betul kepada API menggunakan Dio/Flutter (frontend) dan Go (backend)

WBOY
WBOYke hadapan
2024-02-10 10:48:091138semak imbas

如何使用 Dio/Flutter(前端)和 Go(后端)向 API 发送正确的请求

editor php Yuzai membawakan anda panduan tentang menggunakan Dio/Flutter (bahagian hadapan) dan Go (bahagian belakang) untuk menghantar permintaan yang betul kepada API. Semasa proses pembangunan, berinteraksi dengan API adalah tugas yang tidak dapat dielakkan. Walau bagaimanapun, memastikan ketepatan dan kesahihan permintaan bukanlah mudah. Artikel ini akan memperkenalkan anda secara terperinci cara menggunakan Dio/Flutter dan Go untuk menghantar permintaan yang betul, menjadikan pembangunan anda berfungsi dengan lebih lancar dan cekap. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberi anda panduan dan petua yang berharga. Mari kita meneroka bersama-sama!

Kandungan soalan

Saya sedang menguji ini dalam Android Studio sekarang. Berikut ialah kod Go yang saya cuba gunakan dalam bahagian hadapan Flutter:

func Login(c *gin.Context) {
    //  Get email and password off of req body
    var body struct {
        Email    string
        Password string
    }

    if c.Bind(&body) != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": "Failed to read body",
        })

        return
    }

    var user models.User
    if user.ID == 0 {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": "Invalid email and/or password",
        })
        return
    }

    // Lookup user by email, including records where deleted_at is NULL
    if err := initializers.DB.Where("email = ? AND deleted_at IS NULL", body.Email).First(&user).Error; err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": "Invalid email and/or password",
        })
        return
    }

    //  Compare passwords
    err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(body.Password))
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": "Invalid email and/or password",
        })
        return
    }

    //  Generate JWT Token
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "sub": user.ID,
        "exp": time.Now().Add(time.Hour * 24 * 30).Unix(),
    })
    tokenString, err := token.SignedString([]byte(os.Getenv("SECRET")))

    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": "Failed to create token",
        })
        return
    }

    //  Send back
    c.SetSameSite(http.SameSiteLaxMode)
    c.SetCookie("AuthZ", tokenString, 3600*24*30, "", "", false, true)

    c.JSON(http.StatusOK, gin.H{})
}

//main,go

    r.POST("/login", controllers.Login)

Saya terus mendapat 400 kod ralat dan saya cuba menganalisis sebabnya. Begini cara saya menghantar permintaan:

void postLogin(String email, String password) async {
  Response response;
  response = await _dio.post('$baseUrl/login', data: {
    'email': email,
    'password': password,
  });
}

...

try {
                          postLogin(
                              emailController.text, passwordController.text);
                          print('Login successful');
                        } catch (error) {
                          print('Login failed: $error');
                          // Print Dio error message
                          if (error is DioError) {
                            print('Dio error message: ${error.message}');
                          }
                          setState(() {
                            errorText =
                                'Login failed. Please check your credentials.';
                          });
                        } finally {
                          setState(() {
                            isLoading = false;
                          });
                        }

API berfungsi dalam Posman dan melalui kaedah ujian lain, tetapi tidak dalam Android Studio, sekurang-kurangnya bukan cara saya menggunakan Dio.

Terima kasih atas bantuan anda.

Penyelesaian

Ini kelihatan seperti masalah anda:

var user models.User
if user.ID == 0 {
    c.JSON(http.StatusBadRequest, gin.H{
        "error": "Invalid email and/or password",
    })
    return
}

Anggap models.User 上的 ID 只是一个 int,默认始终为零!您可能想要加载用户,例如在检查 ID sebelum ini diperolehi daripada pangkalan data.

Atas ialah kandungan terperinci Cara menghantar permintaan yang betul kepada API menggunakan Dio/Flutter (frontend) dan Go (backend). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam