Как получить строку json в теле запроса post в файле controllers.py odoo? - PullRequest
1 голос
/ 14 апреля 2020

Я определил класс в файле controllers.py для получения HTTP-запросов. Удаленный сервер отправляет запрос POST, и данные в теле запроса представляют собой строку JSON.

Я могу получить данные в теле запроса напрямую, преобразовав строку JSON в словарь с помощью метода http.request.jsonrequest, но сейчас мне нужно получить исходную строку JSON в теле запроса напрямую, а не в словаре для проверки подписи.

Метод (json.dumps()) прямого преобразования в JSON Строки не могут быть использованы, так как полученная таким образом строка отличается от строки JSON в исходном теле запроса, что может привести к ошибке при проверке подписи.

Что делать об этом? Пожалуйста, помогите мне. Спасибо.

это мой controllers.py

# -*- coding: utf-8 -*-
from odoo import http
class CallbackNotification(http.Controller):

    def safety_judgement(self):
        """
        :return:
        """
        header = http.request.httprequest.headers.environ
        signature = header['HTTP_X_TSIGN_OPEN_SIGNATURE']
        time_stamp = header['HTTP_X_TSIGN_OPEN_TIMESTAMP']

        remote_addr = http.request.httprequest.remote_addr
        if remote_addr != '47.99.80.224':
            return

    @http.route('/signature/process/my_odoo', type='json', auth='none')
    def receive_institution_auth(self, **kw):
        """
        :param kw:
        :return:
        """
        self.safety_judgement()
        request_body = http.request.jsonrequest

        action = request_body['action']
        flow_num = request_body['flowId']
        http_env = http.request.env

        sign_process_id = http_env['sign.process'].sudo().search([('flow_num', '=', flow_num)]).id
        if action == 'SIGN_FLOW_UPDATE':
            third_order = request_body['thirdOrderNo']
            name_id_user_list = third_order.split(',')
            model = name_id_user_list[0]
            record_id = name_id_user_list[1]
            approve_user_id = name_id_user_list[2]

            if approve_user_id != 'p':
                record_obj = http_env[model].sudo(user=int(approve_user_id)).browse(int(record_id))

            sign_result = request_body['signResult']
            result_description = request_body['resultDescription']
            account_num = request_body['accountId']
            org_or_account_num = request_body['authorizedAccountId']

            sign_user_id = http_env['sign.users'].sudo().search([('account_num','=',account_num)]).id
            http_manual_env = http_env['manual.sign'].sudo()
            if account_num == org_or_account_num:
                manual_id = http_manual_env.search([('sign_process_id','=',sign_process_id),
                                                           ('sign_user_id','=',sign_user_id)]).id
            else:
                institution_id = http_env['institution.account'].sudo().search([('org_num','=',org_or_account_num)]).id
                manual_id = http_manual_env.search([('sign_process_id', '=', sign_process_id),
                                                    ('sign_user_id', '=', sign_user_id),
                                                    ('institution_id','=',institution_id)]).id


            if sign_result == 2:
                http_manual_env.browse(manual_id).write({'sign_result':'success'})
                http.request._cr.commit()
                if approve_user_id != 'p':
                    record_obj.approve_action('approved','')
                else:
                    http_env[model].sudo().browse(int(record_id)).write({'partner_sign_state':'success'})

            elif sign_result == 3:
                http_manual_env.browse(manual_id).write({'sign_result':'failed'})
                if approve_user_id == 'p':
                    http_env[model].sudo().browse(int(record_id)).write({'partner_sign_state':'failed'})

            elif sign_result == 4:
                http_manual_env.browse(manual_id).write({'sign_result':'reject'})
                http.request._cr.commit()
                if approve_user_id != 'p':
                    record_obj.approve_action('reject', result_description)
                else:
                    http_env[model].sudo().browse(int(record_id)).write({'partner_sign_state':'reject','partner_reject_reason':result_description})

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

pychong

Вы можете отправить значение из JSON-RPC в ваш Json controller.

Js Файл: где передайте значение перед вызовом контроллера вот так.

var ajax = require('web.ajax');
ajax.jsonRpc("/custom/url", 'call', {'Your Key': Your Value}).then(function(data) {
    if (data) {
        // Code
    } else {
       // Code
}});

Py File: Получить данные из поста вот так,

@http.route(['/custom/url'], type='json', auth="public", website=True)
def custom_cotroller(self, **post):
    get_data = post.get('Your Key')
    # Your Customise Code

Спасибо

0 голосов
/ 14 апреля 2020

Чтобы получить необработанные данные тела, вы можете использовать следующий код:

raw_body_data = http.request.httprequest.data
...