2015-08-30 350 views
2

嘗試聯繫txjsonrpc服務器請求requests.post()txjsonrpc服務器與請求客戶端

服務器

from txjsonrpc.web import jsonrpc 
from twisted.web import server 
from twisted.internet import reactor 


class JsonRpc(jsonrpc.JSONRPC): 
    def jsonrpc_status(self): 
     return {"status": "200"} 

reactor.listenTCP(interface="127.0.0.1", port=7081, factory=server.Site(JsonRpc())) 
reactor.run() 

客戶

curl -X POST http://127.0.0.1:7081 -d '{"params": [], "method": "status"}' 
>>> '{"status": 200}' 

這工作。

Python庫requests並不:

客戶#2

import requests 

req = requests.post(
    url="http://127.0.0.1:7081", 
    data={ 
     "params": [], 
     "method": "status" 
    }) 

print req.status_code 
>>> 500 

服務器噴涌出一個錯誤:

File "/usr/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
exceptions.ValueError: No JSON object could be decoded 

requests.post(data)的參數是在客戶機#正確2例子。但是,如果我看看ngrep輸出,我可以看到params正在被丟棄。

CSI:的ngrep

[email protected]:$ sudo ngrep -qt -W byline port 7081 
interface: eth0 (192.168.1.0/255.255.255.0) 
filter: (ip or ip6) and (port 7081) 

T 2015/08/30 16:03:18.202439 192.168.1.30:41272 -> 192.168.1.61:7081 [AP] 
POST/HTTP/1.1. 
Host: 192.168.1.61:7081. 
Content-Length: 13. 
Content-Type: application/x-www-form-urlencoded. 
Accept-Encoding: gzip, deflate, compress. 
Accept: */*. 
User-Agent: Mozilla 4.3. 
. 
method=status 

正如你看到的,唯一的方法=狀態轉移。 requests決定我的params參數不值得發送,因爲它是空的。這會在txjsonrpc服務器上創建一個例外。

如何聯繫txjsonrpc服務器與requests客戶端請求?

另外;我不介意切換到另一個與Twisted兼容的jsonrpc服務器庫,如果這會讓我的生活更輕鬆。

回答

2

另請注意,您的POST爲requests未發送JSON,因爲您的curl -d是,它發送x-www-form-urlencoded鍵/值對。嘗試在您的requests.post呼叫中將替換爲json=,如this example所示。

+0

謝謝,這確實解決了它。 – cpb2

相關問題