Как вернуть JSON в методе REST get с помощью полного API Odoo

Я сделал api с методом GET в odoo10 и хотел бы, чтобы возвращаемое значение было в json. Когда я запускаю свой код ниже с почтальоном

@http.route("/check_method_get", auth='none', type='http',method=['GET'])
def check_method_get(self,**values):
    output = {
        'results':{
            'code':200,
            'message':'OK'
        }
    }

    return json.dumps(output)

результат в заголовках

Content-Length →43
Content-Type →text/html; charset=utf-8
Date →Mon, 30 Apr 2018 15:07:30 GMT
Server →Werkzeug/0.11.11 Python/2.7.12
Set-Cookie →session_id=505500f3f5b83ada1608d84e38d2f1776006b443;  Expires=Sun, 29-Jul-2018 15:07:30 GMT; Max-Age=7776000; Path=/ 

и результат в Body будет

{"results": {"message": "OK", "code": 200}}

Проблема в том, что Content-Type → text / html. Мне нужен Content-Type → application / json. Затем я меняю свой код ниже

@http.route("/check_method_get", auth='none', type='http',method=['GET'])
def check_method_get(self,**values):
    return Response(headers={
            'Content-Type': 'application/json',
            'results':{
                'code':200,
                'message':'OK'
            }
        })

Результат в заголовке

Content-Length →0
Content-Type →application/json
Date →Mon, 30 Apr 2018 15:18:41 GMT
Server →Werkzeug/0.11.11 Python/2.7.12
Set-Cookie →session_id=505500f3f5b83ada1608d84e38d2f1776006b443;   Expires=Sun, 29-Jul-2018 15:18:41 GMT; Max-Age=7776000; Path=/
results →{'message': 'OK', 'code': 200}

Но в Body результата нет. Я хочу {"results": {"message": "OK", "code": 200}} в Body Result как json.

Есть ли какой-нибудь ключ к решению проблемы, если я искал это возвращаемое значение в JSON только в методе POST.


person Yuniar Kurniawan S    schedule 30.04.2018    source источник


Ответы (1)


Проблема, я думаю, связана с обработкой, которую Odoo запускает в ответ. Поскольку вы указываете type='http', Odoo добавляет соответствующие заголовки для простого HTTP-запроса, а не для application / json.

Попробуй это

@http.route("/check_method_get", auth='none', type='json',method=['GET'])
def check_method_get(self,**values):
    output = {
        'results':{
            'code':200,
            'message':'OK'
        }
    }
return json.dumps(output)

Ваша другая попытка поместила все содержимое в заголовок. Возможно, вы сможете заставить его работать, изменив запрос следующим образом.

@http.route("/check_method_get", auth='none', type='http',method=['GET'])
def check_method_get(self,**values):
    headers = {'Content-Type': 'application/json'}
    body = { 'results': { 'code':200, 'message':'OK' } }

    return Response(json.dumps(body), headers=headers)
person Phillip Stack    schedule 30.04.2018
comment
Большое спасибо, мистер Филип Стек. После отслеживания и отладки базового кода в odoo / odoo / http.py я понял, что у класса Response есть конструктор init, поэтому я понимаю ваш ответ. Я возвращаю Response (json.dumps (body), headers = headers). Еще раз спасибо за вашу помощь. - person Yuniar Kurniawan S; 30.04.2018
comment
О, круто. Я обновлю свой ответ, чтобы отразить правильный порядок. - person Phillip Stack; 30.04.2018
comment
Если вы считаете, что это было полезно, отметьте мой ответ как правильный. Спасибо Юниар - person Phillip Stack; 30.04.2018