axios授权标头仅适用于get请求

时间:2019-06-29 17:55:56

标签: javascript api http authorization axios

我有一个简单的api端点,用于共享需要使用承载令牌进行身份验证的帖子/api/v1/posts/{id}/share

我尝试发送如下所示的POST请求,并且其响应为401

axios.post(`/api/v1/posts/${id}/share`,
        {
        "headers": {
                "Authorization":"Bearer "+token,
                "Content-Type": "application/x-www-form-urlencoded",
                "Accept": "application/json"
            },
        });

仅当我将其更改为在后端接受GET并将代码更改为此时,它才起作用

axios.get(`/api/v1/posts/${id}/share`,
        {
        "headers": {
                "Authorization":"Bearer "+token,
                "Content-Type": "application/x-www-form-urlencoded",
                "Accept": "application/json"
            },
        });

我用http客户端(失眠)测试了端点,所以问题似乎出在axios。为什么会发生这种情况,我该如何解决?

我正在使用的服务器是apache,后端框架是laravel

2 个答案:

答案 0 :(得分:1)

此问题的根本原因是:axios.postaxios.get具有不同的语法-第二个参数在axios.get中表示“ config”,但在{{1中表示“ data” }}。这就是为什么它可以在GET中工作但在POST中失败的原因。

根据axios document,这2种语法为:

  

axios.get(URL [,config])

     

axios.post(URL [,data [,config]])

因此,当您使用代码发送HTTP POST请求时:

axios.post

发送请求时,HTTP 正文axios.post(`/api/v1/posts/${id}/share`, { "headers": { ... }, }); -未配置请求标头。

要使其与{"header":{...}}一起使用,应将axios.post配置对象作为第三个参数传递。如:

headers

答案 1 :(得分:0)

所以我通过使用不同的语法解决了这个问题

const options = {
        method:"post",
        "headers": {
            "Authorization":token,
            "Content-Type": 'application/x-www-form-urlencoded',
            "Accept": "application/json"
        },
        url:`/api/v1/posts/${id}/share`
    };

    axios(options);

老实说,我无法说出发生了什么变化,但是在这里,您可以去看看看到这个的任何人。