axios.post 返回 400 React Native 的错误请求

Posted

技术标签:

【中文标题】axios.post 返回 400 React Native 的错误请求【英文标题】:axios.post returns bad request of 400 React Native 【发布时间】:2020-03-30 05:38:54 【问题描述】:

我从 API 获取令牌,但不幸的是我的 API 返回 400 错误请求。我已经通过 Postman 检查了我的 api,它在那里工作正常。请让我知道解决方案或任何错误。

async componentWillMount()
 axios.post('http://api.myapiurl.com/token', 
                grant_type: 'PASSWORD',
                username: 'MY_USERNAME',
                password: 'MY_PASSWORD'
            , 
                headers: 
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                
            ).then(response => 
                console.log(response.data)
            ).catch(err => console.log("api Erorr: ", err.message))

以下回复有误

请求失败,状态码 400 - node_modules\axios\lib\core\createError.js:16:24 in createError - node_modules\axios\lib\core\settle.js:18:6 在解决 - ... 来自框架内部的另外 10 个堆栈帧

【问题讨论】:

您需要检查服务器上的日志以查看 400 的原因并修复它。仅使用前端代码,我们将无法判断服务器需要什么。 @Zaln KhAn 你一定得到了一些响应错误。检查一下,因为您遇到的错误是我们无法使用此代码找到的。 axios 文档说以不同的方式发送www-form-urlencoded 的参数。你在追吗?? github.com/axios/… 更新了请查收。 默认情况下,你发送的参数会被解析为json。要将其发送至www-form-urlencoded,您需要按照文档进行操作。 【参考方案1】:

使用QueryString.stringify() 解决。我只是将正文传递给QueryString.stringify(),如下所示:

axios.post('http://api.apiurl.com/token', QueryString.stringify(
            grant_type: 'MY_GRANT_TYPE',
            username: 'MY_USERNAME',
            password: 'MY_PASSWORD'
        ), 
            headers: 
                "Content-Type": "application/x-www-form-urlencoded",
            
        ).then(response => 
            console.log(response.data)
        ).catch(err => console.log("api Erorr: ", err.response))

【讨论】:

【参考方案2】:

尝试使用 fetch 代替,可能是 axios 的一些 bug,你不需要添加任何库,这里是一个例子:

fetch("http://api.myapiurl.com/token", 
  method: "POST", // *GET, POST, PUT, DELETE, etc.
  headers: 
    "Content-Type": "application/json"
  ,
  body: JSON.stringify(
    grant_type: "PASSWORD",
    username: "MY_USERNAME",
    password: "MY_PASSWORD"
  ) 
)
  .then(res => 
    res.json();
  )
  .then(data => console.log(data))  // ur data is here
  .catch(err => console.log("api Erorr: ", err));

【讨论】:

我可以在 react native expo 应用程序中使用 fetch 获取数据吗? 你知道发生了什么吗?【参考方案3】:

首先从urlhttps://www.npmjs.com/package/react-native-axios安装包axios 然后创建两个服务来处理 get 和 post 请求,以便您可以重用它们

GetService.js

import axios from 'axios'; 
let constant = 
    baseurl:'https://www.sampleurl.com/'
;
let config = 

    headers: 
    'Content-Type': 'multipart/form-data',
    'Accept': 'application/json'
    
;

export const GetService = (data,Path,jwtKey) => 
    if(jwtKey != '')
        axios.defaults.headers.common['Authorization'] = 'Bearer '+jwtKey;
    

    try
        return axios.get(
                            constant.baseUrl+'api/'+Path, 
                            data, 
                            config
                        );
    catch(error)
        console.warn(error);
    
    

PostService.js

import axios from 'axios'; 
let constant = 
    baseurl:'https://www.sampleurl.com/'
;
let config = 

    headers: 
    'Content-Type': 'multipart/form-data',
    'Accept': 'application/json'
    
;

export const PostService = (data,Path,jwtKey) => 
    if(jwtKey != '')
        axios.defaults.headers.common['Authorization'] = 'Bearer '+jwtKey;
    

    try
        return axios.post(
                            constant.baseUrl+'api/'+Path, 
                            data, 
                            config
                        );
    catch(error)
        console.warn(error);
    

下面给出了使用 get 和 post 服务的示例代码

import  PostService  from './PostService';
import  GetService  from './GetService';


let uploadData = new FormData();
uploadData.append('key1', this.state.value1);
uploadData.append('key2', this.state.value2);
//uploadData.append('uploads',  type: data.mime, uri: data.path, name: "samples" );

let jwtKey = ''; // Authentication key can be added here
PostService(uploadData, 'postUser.php', jwtKey).then((resp) => 
this.setState( uploading: false );
    // resp.data will contain json data from server
).catch(err => 
    // handle error here
);



GetService(, 'getUser.php?uid='+uid, jwtKey).then((resp) => 
    // resp.data will contain json data from server
).catch(err => 
    // handle error here
);

来自我的另一篇帖子Post action API with object parameter within the URL的参考 如果您有任何疑问,请随时了解

【讨论】:

【参考方案4】:

据我所知,您正在发送 json 数据,但您的 Content-Type 标头设置为 application/x-www-form-urlencoded; charset=UTF-8。如果您的 api 需要 json,那么它应该是 application/json

【讨论】:

您的 api 期望是什么? json 还是 FromData? 我正在获取 JSON 格式的数据

以上是关于axios.post 返回 400 React Native 的错误请求的主要内容,如果未能解决你的问题,请参考以下文章

Axios POST 有效,但 axios.create POST 生成 400 Bad Request Error

Axios POST状态400错误请求[重复]

带有 formData 的 axios.post 总是返回空

axios post 400 状态码

Axios Post 请求 Giving Error 400 , Bad Request

axios.post 显示错误“请求失败,状态码为 400”,但邮递员发布了相同的数据