Hessian是一個輕量級的RPC框架,它基於HTTP協議傳輸,使用Hessian二進制序列化,對於數據包比較大的情況比較友好。但是它的參數和返回值都需要實現Serializable接口。Hessian的最大優勢在於跨平臺,多語言支持和比較合理的性能,目前Hessian支持,如Java、Flash/Flex、Python、C++、.NET C#、D、Erlang、PHP、Rubby、Objective C。
對於Hessian類型的接口如何進行調用呢?小編嘗試使用Postman、Httpie都無法調用,於是嘗試使用python進行調用,但這種類型的接口和標準Http協議的接口有所區別,使用requests發起請求也無法實現。查找一些資料,都說使用 hessianlib.py ,但版本好久未更新,也不支持python3,見下圖: 後來才發現原來python3支持hessian需要安裝 python-hessian 擴展包,源碼 https://github.com/bgilmore/mustaine,直接使用 pip install python-hessian 安裝。現在給以下的一個實例:
這是 LmWorkerTaskServcie.java 接口類:
/**
*
* @param
* @return
*/
import java.util.List;
import apollo.erp.base.domain.LmWorkerTask;
/**
*
* @author zt
* @version 1.0
* @date 2018-9-25 下午2:31:00
* 說明:
*
*/
public interface LmWorkerTaskService {
/**
*
* @param barcode
* @param lmTaskJson
* @return
* @throws Exception
*/
public String insertLmWorkerTask(String barcode,String lmTaskJson) ;
}
接下來便是利用python調用上面的接口了,問題就解決了。注意(多數博客就是調用方法不同, __call__可以查看底層源碼)
import json
from pyhessian.client import HessianProxy
def run():
url = "http://192.168.133.129:20880/apollo-erp-remote/lmWorkerTaskService"
params = {
'barcode': 'A502170661032-5-1',
'lmTaskJson': json.dumps({
"barcode": "A502170661032-5-1",
"unitcode": "YB",
"userCode": "211573",
"operateTime": "2018-09-28 11:12:39:667",
"type": "in"
})
}
service = HessianProxy(url)
response = service.__call__(method='insertLmWorkerTask', args=(params['barcode'], params['lmTaskJson']))
return response
if __name__ == '__main__':
print(run())