Retrofit2+Okhttp3+Rxjava通過SOAP協(xié)議請求WebService遇到的坑

1. 請求異步與同步問題
2. 請求和響應(yīng)的序列化和反序列化問題

由于在web端soap協(xié)議交互洞坑,會遇到異步和同步的問題嘹吨,代碼參考如下:

Call<ResponseBody> call = apiService.getRatePlan(envelope);
//異步請求
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call,Response<ResponseBody> response) {
          log.info("onResponse: {}", response.body().toString());
    }
    @Override
    public void onFailure(Call<ResponseBody> call, Throwable throwable) {
          log.info("onFailure: {}", throwable.getMessage());
    }
});

如果想要同步可以使用下面的語法:

try {
    Response<ResponseBody> response = call.execute();
    if(response.isSuccessful()) {
        String result = response.body().string();
        log.info("result:{}",result);
    }
} catch (Exception e) {
    log.error(e.getMessage());
}

對象序列化xml成功狂巢,但是xml反序列化對象就一直為空撑蚌,以下是測試的一段報文

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <RatePlanAllotRS xmlns="http://gv.knt.co.jp/">
            <AllotReposeSegments>
                <AllotReposeSegment Number="1">
                    <RatePlan RatePlanCode="000403002610104017" HotelCode="2610104">
                        <SearchDateRange Start="2020-01-01" End="2020-01-31" />
                        <AllotmentRange>
                            <Allotment>
                                <Text>3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3</Text>
                            </Allotment>
                        </AllotmentRange>
                    </RatePlan>
                </AllotReposeSegment>
            </AllotReposeSegments>
        </RatePlanAllotRS>
    </soap:Body>
</soap:Envelope>

實體類信息

import lombok.Data;
import org.simpleframework.xml.*;

import java.util.List;

@Data
@Root(name = "soap:Envelope",strict = false)
@NamespaceList({
        @Namespace(reference = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi"),
        @Namespace(reference = "http://www.w3.org/2001/XMLSchema", prefix = "xsd"),
        @Namespace(reference = "http://schemas.xmlsoap.org/soap/envelope/", prefix = "soap")
})
public class RatePlanAllotRespEnvelope {
    @Element(name = "soap:Body",required = false)
    private RatePlanAllotBody body;

    @Data
    public static class RatePlanAllotBody {
        @Element(name = "RatePlanAllotRS",required = false)
        @Namespace(reference = "http://gv.knt.co.jp/")
        private RatePlanAllotResp ratePlanAllotResp;
    }

    @Data
    public static class RatePlanAllotResp{
        @Element(name = "Errors",required = false)
        private ErrorInfo errorInfo;

        @Element(name = "Success",required = false)
        private String success;

        @Element(name = "AllotReposeSegments",required = false)
        private AllotReposeSegmentInfo allotReposeSegmentInfo;
    }

    @Data
    public static class ErrorInfo{
        @ElementList(entry = "Error",type = ErrorMessage.class, inline = true, required = false)
        private List<ErrorMessage> errorMessages;
    }

    /**接口請求錯誤提示異常信息*/
    @Data
    public static class ErrorMessage{
        @Attribute(name = "Message")
        private String message;

        @Attribute(name = "Code")
        private String code;
    }

    @Data
    public static class AllotReposeSegmentInfo{
        @ElementList(entry = "AllotReposeSegment",type = AllotReposeSegment.class, inline = true, required = false)
        private List<AllotReposeSegment> allotReposeSegments;
    }

    @Data
    public static class AllotReposeSegment{
        @Attribute(name = "Number")
        private String number;

        @Element(name = "RatePlan")
        private RatePlanResult ratePlanResult;
    }

    @Data
    public static class RatePlanResult{
        @Attribute(name = "RatePlanCode")
        private String ratePlanCode;

        @Attribute(name = "HotelCode")
        private String hotelCode;

        @Element(name = "SearchDateRange")
        private SearchDateRange searchDateRange;

        @Element(name = "AllotmentRange")
        private AllotmentRange allotmentRange;
    }

    @Data
    public static class SearchDateRange{
        @Attribute(name = "Start")
        private String start;
        @Attribute(name = "End")
        private String end;
    }

    @Data
    public static class AllotmentRange{
        @Element(name = "Allotment")
        private Allotment allotment;
    }

    @Data
    public static class Allotment{
        @Element(name = "Text")
        private String text;
    }
}
RatePlanAllotRespEnvelope ratePlanAllotRespEnvelope = persister.read(RatePlanAllotRespEnvelope.class,xml);
System.out.println(JSON.toJSON(ratePlanAllotRespEnvelope));

經(jīng)過測試調(diào)試發(fā)現(xiàn)乒躺,要把soap:Body修改為Body就能反序列化成功近速。

修改后結(jié)果.png

輸出結(jié)果:

{"body":{"ratePlanAllotResp":{"allotReposeSegmentInfo":{"allotReposeSegments":[{"number":"1","ratePlanResult":{"searchDateRange":{"start":"2024-08-01","end":"2024-08-30"},"allotmentRange":{"allotment":{"text":"4,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4"}},"ratePlanCode":"000111010010018051","hotelCode":"10018"}}]}}}}

代碼中使用到的jar依賴:

<dependency>
  <groupId>com.squareup.retrofit2</groupId>
  <artifactId>adapter-rxjava</artifactId>
  <version>2.11.0</version>
</dependency>
<dependency>
  <groupId>com.squareup.retrofit2</groupId>
  <artifactId>converter-simplexml</artifactId>
  <version>2.11.0</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.60</version>
 </dependency>

參考文檔

1.http://www.reibang.com/p/b865c855a1e8
2.http://www.reibang.com/p/e49cf500306e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末科展,一起剝皮案震驚了整個濱河市均牢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌才睹,老刑警劉巖徘跪,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異琅攘,居然都是意外死亡垮庐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門坞琴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哨查,“玉大人,你說我怎么就攤上這事剧辐『ィ” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵荧关,是天一觀的道長护盈。 經(jīng)常有香客問我,道長腐宋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任胸竞,我火速辦了婚禮欺嗤,結(jié)果婚禮上卫枝,老公的妹妹穿的比我還像新娘煎饼。我一直安慰自己,他們只是感情好校赤,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布吆玖。 她就那樣靜靜地躺著马篮,像睡著了一般沾乘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浑测,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天翅阵,我揣著相機與錄音,去河邊找鬼迁央。 笑死掷匠,一個胖子當(dāng)著我的面吹牛岖圈,可吹牛的內(nèi)容都是我干的讹语。 我是一名探鬼主播蜂科,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崇摄!你這毒婦竟也來了慌烧?” 一聲冷哼從身側(cè)響起逐抑,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤屹蚊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汹粤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡嘱兼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了汇四。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片接奈。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡通孽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出背苦,到底是詐尸還是另有隱情,我是刑警寧澤行剂,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站硼讽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏固阁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一备燃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧并齐,春花似錦、人聲如沸况褪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至食侮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锯七,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工眉尸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巨双,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓炉峰,卻偏偏與公主長得像脉执,于是被迫代替她去往敵國和親疼阔。 傳聞我的和親對象是個殘疾皇子半夷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容