猿问

axios post请求主体不与mux服务器解析

我已经实现了一个 API,可以对用户进行身份验证,以便使用 Go 来响应客户端。身份验证路由的处理程序如下:


func (app *application) authenticate(w http.ResponseWriter, r *http.Request) {

    err := r.ParseForm()

    if err != nil {

        app.clientError(w, http.StatusBadRequest)

        return

    }


    username := r.PostForm.Get("username")

    password := r.PostForm.Get("password")


    fmt.Println(r.PostForm)


    u, err := app.user.Get(username, password)

    if err != nil {

        if errors.Is(err, models.ErrNoRecord) || errors.Is(err, bcrypt.ErrMismatchedHashAndPassword) {

            app.notFound(w)

        } else {

            app.serverError(w, err)

        }

        return

    }


    token := jwt.New(jwt.SigningMethodHS256)

    claims := token.Claims.(jwt.MapClaims)


    claims["username"] = u.Username

    claims["name"] = u.Name

    claims["exp"] = time.Now().Add(time.Minute * 30).Unix()


    ts, err := token.SignedString(app.secret)

    if err != nil {

        app.serverError(w, err)

        return

    }


    user := models.UserResponse{u.ID, u.Username, u.Name, "Admin", ts}

    js, err := json.Marshal(user)

    if err != nil {

        app.serverError(w, err)

        return

    }


    w.Header().Set("Content-Type", "application/json")

    w.Write(js)

}

我正在尝试使用 Axios 从 React 应用程序向 API 发送发布请求,如下所示,


const data = JSON.stringify({

    username: params.username,

    password: params.password,

});


api.post('/authenticate', data, {

    headers: {'Content-Type': 'application/json' }

}).then(response => {

    console.log(response);

    resolve({ ok: true, json: () => response.data });

}).catch(err => {

    console.log(err);

    reject('Username or password is incorrect');

})

但请求返回 404 错误。Go控制台显示发布数据为空map[]我尝试将Axios请求中的Content-Type标头更改为multipart/form-data和application/x-www-form-urlencoded,但没有成功。当使用 CURL 发出请求时,

curl -d "username=user&password=password" -X POST http://localhost:4000/authenticate

该请求返回正确的响应。邮递员也工作得很好。仅从 axios 发出请求时,Go 中未解析请求正文可能会出现什么问题?


手掌心
浏览 166回答 4
4回答

千巷猫影

可行的解决方案是使用qs包对数据进行字符串化。import qs from 'qs';const data = {    username: params.username,    password: params.password,};api.post('/authenticate', qs.stringify(data)).then(response => {    console.log(response);    resolve({ ok: true, json: () => response.data });}).catch(err => {    console.log(err);    reject('Username or password is incorrect');})

RISEBY

在您的客户端请求中,您将发送一个 JSON 正文;但是在服务器上您需要 url 编码的值。您应该更改客户端以发送正确的数据,例如像这样encoding/json,或者您需要通过在服务器端使用包解析它来接受 JSON 正文。

MMMHUHU

使用 时您不必担心字符串化axios。默认情况下,库会自动执行此操作。你应该这样做:import axios from 'axios';const api = axios.create({   baseUrl: 'http://localhost:4000/api' })async signIn(username, password) {   try {      const resp = await api.post('/authenticate', data);      return resp.data   } catch(error) {      throw new Error(error?.message || "something went wrong")   }}    然后你可以在 React 组件中调用它。signIn(username, password)   .then(data => setState(data))   .catch(err => alert(error.message)

收到一只叮咚

尝试使用FormData。const data = new FormData();data.set('username', params.username);data.set('password', params.password);
随时随地看视频慕课网APP

相关分类

Go
我要回答