Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Get端点odoov11上发送json作为响应_Python_Json_Controller_Odoo_Odoo 11 - Fatal编程技术网

Python 如何在Get端点odoov11上发送json作为响应

Python 如何在Get端点odoov11上发送json作为响应,python,json,controller,odoo,odoo-11,Python,Json,Controller,Odoo,Odoo 11,当前正在尝试调用一个odoo控制器,该控制器根据我的异常返回json数据 @http.route('/web/update_order_webhook', type='http', csrf=False, auth="public") def update_order_webhook(self, **kwargs): return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset

当前正在尝试调用一个odoo控制器,该控制器根据我的异常返回json数据

@http.route('/web/update_order_webhook', type='http', csrf=False, auth="public")
def update_order_webhook(self, **kwargs):
    return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset=utf-8',status=200)
当我试图把这叫做终点的时候

import requests

url = "http://159.89.197.219:8069/web/update_order_webhook"

headers = {
    'content-type': "application/json"
    }

response = requests.request("GET", url, headers=headers)

print(response.text)
我收到了请求

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>Invalid JSON data: ''</p>
这显然意味着我没有从我的odoo端点获取json响应数据。 根据上次的回答,我已经更新了我的代码

@http.route('/web/update_order_webhook', type='json', auth="public", website=True)
    def update_order_webhook(self, **kwargs):
         return json.dumps({"yes":"i am json"})
但是现在我在调用端点时出现了新的错误

Bad Request
<function Binary.update_order_webhook at 0x7efd82ac8510>, /web/update_order_webhook: Function declared as capable of handling request of type 'json' but called with a request of type 'http'
请求错误
,/web/update\u order\u webhook:函数声明为能够处理'json'类型的请求,但调用时使用'http'类型的请求

用于您的路线。使用type=“json”标志


作为对您问题的更新,我邀请您查看下面的链接,它与您的问题处理相同:

因此,解决方案是设置python方法,就像您已经对类型“json”所做的那样,在请求服务器时也使用“POST方法”,在客户端,您必须发出GET请求并从json字段中获取结果

python方法将是:

@http.route('/web/update_order_webhook',methods=['POST'], type='json', csrf=False, auth="public")
    def update_order_webhook(self, **kwargs):
        return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset=utf-8',status=200)
import requests
url = "http://159.89.197.219:8069/web/update_order_webhook"
payload = {'key1':'val1','key2':'val2'}
response = requests.post(url, data=payload)
print(response.text)
print(response.json())
客户方将:

@http.route('/web/update_order_webhook',methods=['POST'], type='json', csrf=False, auth="public")
    def update_order_webhook(self, **kwargs):
        return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset=utf-8',status=200)
import requests
url = "http://159.89.197.219:8069/web/update_order_webhook"
payload = {'key1':'val1','key2':'val2'}
response = requests.post(url, data=payload)
print(response.text)
print(response.json())
检查此url以查看有关pyhton中发出请求的新方法的更多详细信息:

更新结束

若要返回html响应,请替换请求的标题类型:text/html,否则方法的响应类型必须为“json”

@http.route('/web/update_order_webhook', type='json', csrf=False, auth="public")
def update_order_webhook(self, **kwargs):
    return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset=utf-8',status=200)
还可以从odoo github回购协议中查看此示例:

日历主控制器的接受方法:

@http.route('/calendar/meeting/accept', type='http', auth="calendar")
    def accept(self, db, token, action, id, **kwargs):
        registry = registry_get(db)
        with registry.cursor() as cr:
            env = Environment(cr, SUPERUSER_ID, {})
            attendee = env['calendar.attendee'].search([('access_token', '=', token), ('state', '!=', 'accepted')])
            if attendee:
                attendee.do_accept()
        return self.view(db, token, action, id, view='form')
如果查看此方法的返回,您会注意到它是一个视图(表单视图),因此响应类型是http

在同一个文件中,您将找到返回json响应的notify_ack方法,从而将类型设置为“json”

@http.route('/calendar/notify_ack', type='json', auth="user")
    def notify_ack(self, type=''):
        return request.env['res.partner']._set_calendar_last_notif_ack()

是的。ODOO HTTP GET方法100%有效,请遵照我的指导。

控制器应为type='json',而不是type='http'

“侯赛因·阿里”在他的古尔站上绝对正确,这是我在下面为奥多写的GET方法的解决方案

注意:我已经用我的示例代码为您提供了解决方案,您必须按照我下面的解释更正参数

import requests

url = "https://dev-expert.snippetbucket.com/api/get_user_information/"


headers = {
    'content-type': "application/json",
    'user-token': "02BXD2AGqVH-TEJASTANK-gg92DwntD8f1p0tb",
    'cache-control': "no-cache",
    }
payload = "{\"params\": {}}"
response = requests.request("GET", url, data=payload, headers=headers)

print(response.text)
此解决方案绝对100%有效,只需添加数据=有效负载,这也适用于最新版本13.0的odoo。由于版本14尚未发布,所以不能说

该解决方案也适用于odoo社区和企业版

特别说明: 可以看出,控制器中的odoo type='json'并不意味着http json请求。type='json'是它的json rpc

问候,,
Tejas-SnippetBucket.com

我认为这不重要。好的@Phillip我会实现它,如果它成功了,我会接受你的回答谢谢你的时间SirBad请求,/web/update\u order\u webhook:Function声明为能够处理“json”类型的请求,但使用“http'@http.route”类型的请求调用('/web/update_order_webhook',type='json',auth='public',website=True)按照你的指示。我已经更新了我的代码。现在我遇到了这个错误。我想问题出在你的请求上。不,我只想返回内容类型Json。我更新了我的答案,检查它并告诉我它是否有效。我通过在odoo conf文件中添加db过滤器解决了这个问题。因为我的服务器有多个数据库。所以请求者无法理解感谢您的努力和时间,我接受您的回答,因为我有一个新的问题确认销售订单操作={“类型”:“ir.actions.act\u窗口”,“view\u模式”:“tree”,“res\u model”:object.Sale.order,“res\u id”:object.action\u confirm\u sale\u order,}我想使用ir.action.server在odoo 11中的菜单操作中添加项目,如果您知道我如何做,请更新我。我被困在这一点上。它没有显示我的菜单项。这是官方链接,您可以在下面查看,然后请阅读