前言
其實大部分接口服務都應該是與語言無關,只是部分重量級後端的實現還需要一些老牌語言。本文就僅僅介紹下Python向Java接口發送請求的一個簡短過程,主要是Python代碼,Java接口服務涉及到embed-tomcat,不明細節,絕不妄言。
代碼簡例
請求
簡單一個Python類,用於封裝請求傳參。至於爲什麼屬性名是駝峯式的,後面會說的。
class Person(object):
def __init__(self, name, prop_dict):
"""
用於傳遞一個人的相關信息
Args:
name: str,姓名
prop_dict: dict{str:str} 人其他屬性的自定義字典
"""
self.name = name
self.propDict = prop_dict
簡單一個發送post請求的方法。注意下這裏有個對象序列化的類,這樣能夠保證Person對象被傳入時能夠被正常序列化。(當然也因爲類構造比較簡單的原因)
import json
import requests
class ComplexEncoder(json.JSONEncoder):
"""
對象序列化
"""
def default(self, obj):
return obj.__dict__
def send_post(rest_url, params):
"""
以json發送post請求
Args:
rest_url: 請求地址
params: 參數
Returns:
"""
json_data = json.dumps(params, ensure_ascii=False, cls=ComplexEncoder)
response_text = requests.post(url=rest_url, data=json_data).text
return response_text
接收
Java端服務。這裏僅僅提一下傳輸時的json字符串到Java具體對象的映射相關方法。
/**
* 與Python Person類對應的Java類,注意變量名是保持一致,所以Python中才會是駝峯式
*/
public class Person {
/**
* 姓名
*/
private String vertexLabel;
/**
* 人其他屬性的自定義字典
*/
private Map<String, String> propDict;
public String getVertexLabel() {
return vertexLabel;
}
public void setVertexLabel(String vertexLabel) {
this.vertexLabel = vertexLabel;
}
public Map<String, String> getPropDict() {
return propDict;
}
public void setPropDict(Map<String, String> propDict) {
this.propDict = propDict;
}
}
解析json字符串到對應對象,使用fastjson。
private <T> T getParams(String jsonStr, Class<T> clazz) {
JSONObject jsonObject = JSON.parseObject(jsonStr);
return jsonObject.toJavaObject(clazz);
}
解析
自定義一個簡單的異常類,用於統一處理錯誤信息。
class ResponseErrException(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
解析消息對應的方法。假設正確後的返回消息json爲
{"custom":"success","status":{"code":"000000","text":"請求成功"}}
接口執行拋出異常或者有可預知錯誤時返回消息json爲
{"custom":"","status":{"code":"000010","text":"已存在的人:張三"}}
def parse_json(json_rst):
"""
解析json,獲取返回消息
Args:
json_rst:
Returns:
"""
if json_rst is None or json_rst == "":
raise ResponseErrException("返回消息爲空")
try:
json_data = json.loads(json_rst, encoding="utf-8")
except Exception as e:
raise ResponseErrException("解析異常,返回消息:" + json_rst)
status_msg = json_data["status"]
if "000000" != status_msg["code"]:
raise ResponseErrException(status_msg["text"])
return json_data["custom"]
測試方法
if __name__ == "__main__":
person = Person("張三", {"age": "18", "height": "175"})
# json_data = json.dumps(person, ensure_ascii=False, cls=ComplexEncoder)
# '{"name": "張三", "propDict": {"age": "18", "height": "175"}}'
rst_json = send_post("ip:port/test", person)
try:
rst = parse_data(rst_json)
except ResponseErrException as e:
print("err:" + e.value)
後語
由於代碼涉及的內容有些多,所以都是以片段的形式展示,示例都比較簡單,感覺其實也不會有很多營養,估計也就以後自己品品的這個樣子~~