gpt4 book ai didi

javascript - Axios 未传递 Content-Type header

转载 作者:行者123 更新时间:2023-12-03 06:41:36 25 4
gpt4 key购买 nike

我在后端运行一个 Odoo 实例,我创建了一个自定义模块来公开一个网络 Controller ,如下所示:

网络 Controller

# -*- coding: utf-8 -*-
from odoo import http
import odoo
from odoo.http import Response, request
from werkzeug import wrappers
import json


class VueWebServices(http.Controller):
@http.route('/vuews/msg/', auth='none', type='json', methods=['POST', 'GET', 'OPTIONS'], csrf=False)
def answermsg(self, **post):
product_ids = request.env['product.product'].sudo().search([])
dict = {}
r = request
d = request.httprequest.data
dv = http.request.params
for k in product_ids:
tuple = {}
tuple.update({"name":k['name']})
tuple.update({"id": k['id']})
dict.update(tuple)
return json.dumps(dict)

为了允许cors,我也通过Nginx代理了odoo。这是 nginx.conf 的样子:

nginx.conf

upstream odoo {
server 127.0.0.1:8069;
}
server {
listen 443 default;
server_name localhost;
root c:/nginx/html;
index index.html index.htm;

access_log c:/nginx/logs/odoo.access.log;
error_log c:/nginx/logs/odoo.error.log;

proxy_buffers 16 64k;
proxy_buffer_size 128k;

location / {
proxy_pass http://odoo;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;

proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;

add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept' always;
add_header 'Access-Control-Request-Headers' 'Content-Type' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
}

location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}


}

当我尝试通过 postman 访问路线时,它按预期工作。但是当我尝试通过 axios 访问它时,我收到 400 BAD REQUEST。在 odoo 控制台中,它向我抛出这个:

下面是我的 Vue JS 应用查询 Controller 的方式:

axios({
method: "POST",
headers: {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
},
data: {
"message": "Hello World"
},
url: "http://localhost:443/vuews/msg"
});

我显然传递了 content-type : 'application/json' header ,那有什么问题吗?

最佳答案

终于解决了。这是一个 CORS 问题,我通过修改 nginx.conf 中的代码修复了一个问题,如下所示:

upstream odoo {
server 127.0.0.1:8069;
}
server {
listen 443 default;
server_name localhost;
root c:/nginx/html;
index index.html index.htm;

access_log c:/nginx/logs/odoo.access.log;
error_log c:/nginx/logs/odoo.error.log;

proxy_buffers 16 64k;
proxy_buffer_size 128k;

location / {
proxy_pass http://odoo;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;

proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;


if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

add_header 'Access-Control-Allow-Headers' 'DNT,access-control-allow-origin,x-openerp-session-id,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'application/json charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,access-control-allow-origin,x-odoo-session-id,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Allow-Credentials' 'true';
}

if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,access-control-allow-origin,x-odoo-session-id,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Allow-Credentials' 'true';
}

}

location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}


}

请注意:Access-Control-Allow-Origin header 中,我指定了我正在处理的应用程序的地址和端口,http ://localhost:8080。您可以使用 '*' 或任何适合您的地址。此外,Access-Control-Allow-Credentials header 不是必需的,除非您计划从您的应用程序发送身份验证 cookie/ header 以从服务器访问某些路由。在我的例子中,我将参数 withCredentials: true 添加到我的 axios 调用中,因此我必须将 Access-Control-Allow-Credentials : true header 添加到 nginx.conf,还必须指定我的 vue 应用程序的地址和端口。 (本地主机:8080)。

或者,如果您使用的是 Odoo 网络 Controller ,则无需 Nginx,只需将 cors='*' 装饰器添加到您的网络 Controller 声明即可。这是一个例子:

@http.route('/vuews/msg/', auth='none', type='json', methods=['POST', 'GET', 'OPTIONS'], cors='*', csrf=False)

奖励:如果您计划通过 HTTP POST 请求将数据发送到 Odoo 网络 Controller ,请务必将其包含在 params:{} 中,如下所示:

data: {
jsonrpc: '2.0',
method: 'call',
id: 1,
params: {
message: 'Hello World'
}
},

然后您可以通过 post 对象在后台访问它,前提是您在 Controller 的函数参数中声明了它,如下所示:

@http.route('/vuews/msg/', auth='none', type='json', methods=['POST', 'GET', 'OPTIONS'], csrf=False)
def answermsg(self, **post):
// do something here... ex: data = post;

我希望这可以帮助任何遇到这个问题的人。如果您需要帮助,请随时与我联系。

关于javascript - Axios 未传递 Content-Type header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com