Python對接Java Rest接口簡例

前言

其實大部分接口服務都應該是與語言無關,只是部分重量級後端的實現還需要一些老牌語言。本文就僅僅介紹下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)

後語

由於代碼涉及的內容有些多,所以都是以片段的形式展示,示例都比較簡單,感覺其實也不會有很多營養,估計也就以後自己品品的這個樣子~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章