在前面,我有这样的功能:
export const uploadFormData = async (
token: string,
email: string,
formInfo: Array<Object>,
): Promise<any> => {
const formData = new FormData();
formData.append('email', email);
formData.append('form_info', JSON.stringify({ formInfo }));
return fetch(
`${process.env.ENDPOINT}/upload_form_data/`,
{
method: 'POST',
headers: {
Authorization: `Token ${token}`,
},
body: formData,
},
).then((response) => {
console.log(response.body?.getReader());
if (response.status === 404) {
throw Error('Url not found');
}
if (response.status === 422) {
throw Error('Wrong request format');
}
if (response.status !== 200) {
throw Error('Something went wrong with uploading the form data.');
}
const data = response.json();
return {
succes: true,
data,
};
}).catch((error) => Promise.reject(error));
};
它将POST
请求发送到FastAPI后端中的此端点:
@app.post("/api/queue/upload_form_data/")
async def upload_form_data(
email: str = Body(...),
form_info: str = Body(...),
authorization: str = Header(...),
):
return 'form data processing'
但是一直抛出以下错误:
导致这些错误的请求有什么问题?
发布于 2022-10-16 15:50:29
在Swagger/OpenAPI规范中,Authorization
是一个保留的头部,以及Accept
和Content-Type
头部--参见自吹自擂文件-for Swagger的内置认证/授权功能;因此,不允许定义它们。如果您正在使用Swagger,则不能在端点的参数中定义它,因为在通过Swagger提交请求时,它将被忽略,并且您将得到一个422 Unprocessable Entity
错误,其中有一条正文消息,其中说authorization
标头正在陷入困境(就像在您的问题中发布的错误一样)。
解决方案
如果您不需要Swagger来测试您的应用程序,您可以保持原样,继续使用JavaScript 取API,在标头中传递Authorization
。另外,请注意,您实际上不必在端点中定义任何Header
参数,因为您总是可以通过Request
对象访问它们,例如:
from fastapi import Request
@app.post('/')
def main(request: Request):
token = request.headers.get('authorization')
return token
如果您也需要使用Swagger,一种解决方案是将authorization
Header
参数重命名为其他东西,例如token: str = Header(...)
。然后,在端点内部检查API键是否在token
或request.headers.get('authorization')
-if中,这都是None
的结果,这意味着没有提供Authorization
头。否则,使用FastAPI的HTTPBearer
,它将允许您在/docs
的Swagger自动文档中单击屏幕右上角的Authorize
按钮,您可以在Value
字段中键入Value
键。这将在请求头中设置Authorization
标头。示例:
from fastapi.security import HTTPBearer
security = HTTPBearer()
@app.get('/')
def main(authorization = Depends(security)):
return authorization.credentials
或者,您可以使用APIKeyHeader
from fastapi.security.api_key import APIKeyHeader
from fastapi import Security
api_key = APIKeyHeader(name='Authorization')
@app.get('/')
def main(token = Security(api_key)):
return token
https://stackoverflow.com/questions/74085996
复制相似问题