2016-10-04 60 views
2

我嘗試過不同的方式,但他們沒有奏效。如何在Odoo JSON控制器中發送簡單的消息和狀態作爲響應?

首先,我試過這樣:

import openerp.http as http 
from openerp.http import Response 

class ResPartnerController(http.Controller): 

    @http.route('/odoo/create_partner', type='json', auth='none') 
    def index(self, **kwargs): 

    Response.status = '400' 
    return "Result message" 

我得到正確的狀態,並在客戶端的消息。但是,如果我做的Odoo接口

enter image description here

的任何行動,我得到這個奇怪的警告是有辦法避免這種情況的消息?

我這個試圖左右逢源,以及:

data = {'result': 'RESULT message'} 
json_data = json.dumps(data, encoding='utf-8') 
headers = [('Content-Type', '{}; charset=utf-8'.format('application/json'))] 
mimetype = 'application/json' 
res = Response(
    response=json_data, 
    status=status, 
    headers=headers, 
    mimetype=mimetype, 
) 
return res 
msg = u'Response 200 badly built, falling back to a simple 200 OK response' 
res = Response(msg, status=200) 
return res 

但我總是得到這個錯誤在客戶端回答:

TypeError: <Response 9 bytes [400 BAD REQUEST]> is not JSON serializable\n", "message": "<Response 9 bytes [400 BAD REQUEST]> is not JSON serializable" 

那麼,有沒有一個乾淨的方式回答一個簡單的消息與響應的狀態?

給我發送響應的狀態,以及

如果我只是迴應的消息一切工作正常,但如何改變狀態,而不怪異的行爲是很重要的?

順便說一句,我用這個腳本做呼叫

# -*- coding: utf-8 -*- 

import requests 
import json 

url = 'http://localhost:8069/odoo/create_partner' 
headers = {'Content-Type': 'application/json'} 

data_res_partner = { 
    'params': { 
     'name': 'Example', 
     'email': '[email protected]', 
    } 
} 

data_json = json.dumps(data_res_partner) 
response = requests.post(url=url, data=data_json, headers=headers) 
print(response.status_code) 
print(response.content) 

更新

最後@Phillip棧告訴我,XML-RPC要做到這一點,所以我寫了這個other question在爲了澄清我的疑惑。

+0

什麼是你的控制器一樣的定義是什麼?它是'json'還是'http'控制器?它接受什麼樣的請求?我們可以猜出這些細節,但最好包含控制器的完整代碼,而不是'[...]' – danidee

+1

從外部腳本的外觀來看,您正試圖創建一個休息界面來創建聯繫人。你應該真的使用jsonrpc或xmlrpc,因爲這個結構已經存在,可以完成你想要完成的任務。 –

+0

感謝您的評論@phillipstack。那麼,我應該何時使用控制器?僅需要將網站顯示爲回覆? – ChesuCR

回答

1

試試這個,我不確定是否理解這裏涉及的所有複雜性。嘗試一個香草請求,並將該響應解析爲json。如果我找出json請求/響應,我會更新它。我遇到類似的問題,但能夠得到以下結果。

嘗試此鍵入http

@http.route('/test/test', auth='none', type='http') 
def test(self, **kwargs): 
    return Response("TEST",content_type='text/html;charset=utf-8',status=500) 

我的要求是這樣的。

r = requests.post("http://localhost:8069/test/test",data={}))  
>>> r 
<Response [500]> 
>>> r.text 
u'TEST' 

嘗試此類型JSON

@http.route('/test/test', auth='none', type='json') 
def test(self, **kwargs): 
    Response.status = '400' 
    return {'test':True} 

使用結構化這樣的請求。

json_data = {"test": True} 

requests.post("http://localhost:8069/test/test",data=json.dumps(json_data),headers={"Content-Type":"application/json"}) 

使用上面的python請求。

使用下面的例子爲JavaScript

var json_data = { 'test': true }; 

$.ajax({ 
     type: "POST", 
     url: "/test/test", 
     async: false, 
     data: JSON.stringify(json_data), 
     contentType: "application/json", 
     complete: function (data) { 
      console.log(data); 
     } 
}); 
+0

感謝您的回答。我試過你的代碼,但我想告訴你,這是一個JSON控制器,所以我得到這個錯誤'TypeError:<響應4字節[500內部服務器錯誤]>不是JSON序列化'。再看看我的問題,我用控制器的更多行更新它:) – ChesuCR

+0

我已更新我的發佈。雖然這是一個微不足道的例子,一直在爲我工作。 –

+0

如果我做'Response.status ='400'',我在界面中收到一個錯誤,就像我在my question中寫的一樣。之後,我無法在Odoo中執行任何操作,因爲該錯誤總是顯示 – ChesuCR

相關問題