Golang中如何获取HTTP POST请求的响应

Golang中如何获取HTTP POST请求的响应 目前我正在编写一个网页,前端使用React JS,后端使用Golang。页面上有几个输入表单,当用户输入数据时,我会向这个路由(’/user/auth’)发送POST请求,并用Golang验证这些输入。当密码错误时,我想在前端显示一条消息,该如何实现?在检查输入后,如何从Golang发送数据到React?

6 回复

Rest API

更多关于Golang中如何获取HTTP POST请求的响应的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你是通过 REST API 调用发帖,还是将浏览器重定向到这个页面?

您还需要为经过身份验证的会话设置一些cookie或类似机制,以确认用户已通过身份验证。

这取决于你如何进行用户认证/授权。你可以使用JWT令牌并将令牌附加到每个请求的头部,或者在数据库中管理会话,或者采用你能想到的任何其他方式。我并不是说某种方案一定优于其他方案,只是说明管理用户会话有很多选择,发帖人应该对这些方案进行研究。

我不明白问题出在哪里,你可以简单地用一些简单的JSON来响应请求:

{
  "status": "error",
  "error": "invalid username or password"
}

你也可以用纯文本响应,空响应表示一切正常,出现错误时发送错误信息。或者直接使用HTTP响应码来表示错误。无论如何,如果你在JSON格式中给出错误信息,那么在前端检查状态并在需要时显示错误。

但有一点需要考虑:永远不要暴露具体的用户名或密码错误,这只会给攻击者提供线索,始终说明用户名和密码不匹配。

在Golang中处理HTTP POST请求并返回响应给前端React应用,可以通过以下方式实现。你需要使用Golang的net/http包来处理请求,并返回适当的HTTP状态码和JSON响应。

后端Golang代码示例

首先,设置一个HTTP处理函数来接收POST请求,验证输入,并根据结果返回响应。

package main

import (
    "encoding/json"
    "net/http"
)

// 定义请求和响应的结构体
type AuthRequest struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

type AuthResponse struct {
    Success bool   `json:"success"`
    Message string `json:"message"`
}

func userAuthHandler(w http.ResponseWriter, r *http.Request) {
    // 只处理POST请求
    if r.Method != http.MethodPost {
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
        return
    }

    // 解析请求体中的JSON数据
    var req AuthRequest
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, "Invalid request body", http.StatusBadRequest)
        return
    }

    // 验证用户名和密码(示例:假设正确密码是 "correctpassword")
    var resp AuthResponse
    if req.Password == "correctpassword" {
        resp.Success = true
        resp.Message = "Authentication successful"
    } else {
        resp.Success = false
        resp.Message = "Invalid password"
    }

    // 设置响应头为JSON
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK) // 返回200状态码

    // 将响应编码为JSON并发送
    if err := json.NewEncoder(w).Encode(resp); err != nil {
        http.Error(w, "Failed to encode response", http.StatusInternalServerError)
    }
}

func main() {
    http.HandleFunc("/user/auth", userAuthHandler)
    http.ListenAndServe(":8080", nil)
}

前端React代码示例

在React中,使用fetch API发送POST请求,并根据响应更新UI状态以显示消息。

import React, { useState } from 'react';

function AuthForm() {
    const [username, setUsername] = useState('');
    const [password, setPassword] = useState('');
    const [message, setMessage] = useState('');

    const handleSubmit = async (e) => {
        e.preventDefault();
        
        // 发送POST请求到Golang后端
        const response = await fetch('http://localhost:8080/user/auth', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({ username, password }),
        });

        // 解析JSON响应
        const data = await response.json();
        
        // 根据响应更新消息
        if (data.success) {
            setMessage('登录成功!');
        } else {
            setMessage(`错误:${data.message}`);
        }
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <input
                    type="text"
                    value={username}
                    onChange={(e) => setUsername(e.target.value)}
                    placeholder="用户名"
                />
                <input
                    type="password"
                    value={password}
                    onChange={(e) => setPassword(e.target.value)}
                    placeholder="密码"
                />
                <button type="submit">提交</button>
            </form>
            {message && <p>{message}</p>}
        </div>
    );
}

export default AuthForm;

说明

  • 后端部分:Golang处理函数解析POST请求的JSON体,验证密码,并返回一个JSON响应,其中包含success布尔值和message字符串。使用json.NewEncoder将响应编码为JSON。
  • 前端部分:React组件使用fetch发送POST请求,将用户输入作为JSON体发送。收到响应后,解析JSON并更新状态变量message,在UI中显示相应信息。
  • 错误处理:如果密码错误,后端返回success: false和错误消息,前端据此显示提示。

确保Golang服务器运行在端口8080(或根据你的配置调整),并且React应用正确发送请求到该端点。

回到顶部