我尝试使用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;
随附响应图片
3条答案
按热度按时间evrscar21#
OPTIONS
请求是所谓的preflight请求的一部分,它需要计算CORS报头,以了解哪些需要/允许与实际的GET
请求一起发送到服务器。这就是为什么你通常会在网络标签中看到两个请求(取决于你的设置)在你的例子中,你似乎没有在你的服务器上配置任何与CORS相关的东西(因此是405),或者特别禁止GET/POST请求以外的任何东西。或者该网站可能禁止其他人访问其数据
h7wcgrx32#
OPTIONS请求是由浏览器生成的固有请求。浏览器使用OPTIONS调用来找出服务器允许的方法。
用于支持来自浏览器的请求的API服务器必须允许OPTIONS以及实际方法(GET / POST / etc)。
如果服务器不支持OPTIONS,则可能不支持浏览器。
不支持OPTIONS的服务器只能支持非浏览器客户端(示例:REST客户端(Java / nodejs)
如何解决问题?
“405 - OPTIONS方法不允许”的问题可以通过以下两种方式之一解决:
1.更新服务器以支持OPTIONS方法(建议用于应该支持浏览器的服务器)
1.开发一个“中间REST客户端”,它将代表浏览器从服务器请求数据
浏览器<-->REST客户端(支持OPTIONS、POST)<-->实际Web服务(不支持OPTIONS)
5q4ezhmt3#
通常情况下,
options
请求会在get
之前自动发送,以便在触发get
调用之前获得一些初步数据。检查这个https://github.com/axios/axios/issues/475。