为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
手掌心 2023-08-14 16:43:17
我已经实现了一个 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 中未解析请求正文可能会出现什么问题?
查看完整描述

4 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

可行的解决方案是使用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');

})


查看完整回答
反对 回复 2023-08-14
?
RISEBY

TA贡献1856条经验 获得超5个赞

在您的客户端请求中,您将发送一个 JSON 正文;但是在服务器上您需要 url 编码的值。

您应该更改客户端以发送正确的数据,例如像这样encoding/json,或者您需要通过在服务器端使用包解析它来接受 JSON 正文。


查看完整回答
反对 回复 2023-08-14
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

使用 时您不必担心字符串化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)


查看完整回答
反对 回复 2023-08-14
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

尝试使用FormData。


const data = new FormData();

data.set('username', params.username);

data.set('password', params.password);


查看完整回答
反对 回复 2023-08-14
  • 4 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信