AXIOS请求方法更改为“OPTIONS”而不是“GET”

eqzww0vc  于 9个月前  发布在  iOS
关注(0)|答案(3)|浏览(84)

我尝试使用Axios(这是我第一次使用Axios)使用React应用程序(TSX)调用和API,每次运行应用程序时,方法都会更改为“OPTIONS”,请求变得无效。我们将不胜感激。分享我的代码对不起,出于安全原因,我隐藏了Auth令牌。
代码

import React, { useState, useEffect } from 'react';
import axios from 'axios';

interface Brands {
  BrandId: number;
  Name: string;
}
const AUTH_TOKEN = Something hiden for security;

var baseUrl = axios.defaults.baseURL = 'https://fppdirectapi-prod.fuelpricesqld.com.au/Subscriber/GetCountryBrands?countryId=21';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.get['Content-Type'] = 'application/json';
axios.defaults.method = 'get';

const FetchFuelType = () => {
  const [brands, setPosts] = useState<Brands[]>([]);

  useEffect(() => {
    axios.get(baseUrl)

      .then(res => {
        console.log(res)
        setPosts(res.data)
      })
      .catch(err => {
        console.log(err)
      })
  }, [])
  return (
    <div>
      <ul>
        {brands.map(Brand => (<li key={Brand.BrandId}>{Brand.Name}</li>))}
      </ul>
    </div>
  );
};

export default FetchFuelType;

随附响应图片

evrscar2

evrscar21#

OPTIONS请求是所谓的preflight请求的一部分,它需要计算CORS报头,以了解哪些需要/允许与实际的GET请求一起发送到服务器。这就是为什么你通常会在网络标签中看到两个请求(取决于你的设置)
在你的例子中,你似乎没有在你的服务器上配置任何与CORS相关的东西(因此是405),或者特别禁止GET/POST请求以外的任何东西。或者该网站可能禁止其他人访问其数据

h7wcgrx3

h7wcgrx32#

OPTIONS请求是由浏览器生成的固有请求。浏览器使用OPTIONS调用来找出服务器允许的方法。
用于支持来自浏览器的请求的API服务器必须允许OPTIONS以及实际方法(GET / POST / etc)。
如果服务器不支持OPTIONS,则可能不支持浏览器。
不支持OPTIONS的服务器只能支持非浏览器客户端(示例:REST客户端(Java / nodejs)

如何解决问题?

“405 - OPTIONS方法不允许”的问题可以通过以下两种方式之一解决:
1.更新服务器以支持OPTIONS方法(建议用于应该支持浏览器的服务器)
1.开发一个“中间REST客户端”,它将代表浏览器从服务器请求数据

浏览器<-->REST客户端(支持OPTIONS、POST)<-->实际Web服务(不支持OPTIONS)

5q4ezhmt

5q4ezhmt3#

通常情况下,options请求会在get之前自动发送,以便在触发get调用之前获得一些初步数据。检查这个https://github.com/axios/axios/issues/475

相关问题