你以為你以為的就是你以為的嗎?記一次伺服器點對點通知的聯調過程

来源:https://www.cnblogs.com/buguge/archive/2019/12/13/12035854.html
-Advertisement-
Play Games

公司兩個系統。 我們的A系統要給B系統上送業務簽約單申請。B系統接收數據後,非同步處理,簽約完成會主動發送通知給我們的A系統。 介面文檔里說明瞭,通過http協議的post請求來發送非同步通知,報文是json格式字元串。But,But,But, ...


公司兩個系統。

我們的A系統要給B系統上送業務簽約單申請。B系統接收數據後,非同步處理,簽約完成會主動發送通知給我們的A系統。

介面文檔里說明瞭,通過http協議的post請求來發送非同步通知,報文是json格式字元串。

 

我們A系統定義restful的http介面。

【題外話】@RequestBody註解:@RequestBody接收的參數是來自requestBody中,即請求體。適用於http post請求。請求端通過HttpEntity傳遞參數,併在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用 HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數據,然後綁定到相應的bean上。

@RestController
@Slf4j
public class TaxNotifyController {

    @Reference
    private TaxNotifyService taxNotifyService;

    /**
     *
     * @param notifyVO
     * @return
     */
    @PostMapping("/ayncNotify")
    @UnAuthToken
    public String ayncNotify(@RequestBody NotifyVO notifyVO){
        log.info("收到回調----非同步回調----非同步通知----回調通知:{}", JSON.toJSONString(notifyVO));
        String respText = taxNotifyService.ayncNotify(notifyVO);
        log.info("回調----非同步回調----非同步通知----回調通知 回寫內容:{}",respText);
        return respText;
    }
}

 

QA在測試過程中,發現我方一直收不到對方的回調。有對方日誌截圖為證。

 

查看我們A系統的log。並沒有發現“收到回調----非同步回調----非同步通知----回調通知”這樣的log。

 

難道是B系統到我們A系統的網路不通?雙方都是測試環境呀!還是去找運維確認吧。

[root@localhost logs]# curl http://192.168.40.84:8802/ent-boot/ayncNotify
{"code":"ERROR","message":"Request method 'GET' not supported"}

 

因為需要POST,所以curl接收到這個錯誤。但至少證明這2個系統間的網路是沒問題的。

 

再次確認我方log。發現蛛絲馬跡:

2019-12-13 11:07:01.894 [http-nio-8802-exec-9] INFO  com.emaxcard.car.filter.CrosXssFilter:40 - 
CrosXssFilter.......orignal url:/ent-boot/ayncNotify,ParameterMap:{} 2019-12-13 11:07:01.895 [http-nio-8802-exec-9] WARN o.s.w.s.m.support.DefaultHandlerExceptionResolver:197 -
Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/xml;charset=UTF-8' not supported] 2019-12-13 11:07:01.895 [http-nio-8802-exec-9] INFO com.emaxcard.car.filter.CrosXssFilter:44 -
CrosXssFilter..........doFilter url:/ent-boot/ayncNotify,ParameterMap:{}

 

莫非,對方給的content-type是text/xml??

 

找B系統的開發同學,經查代碼里HttpUtil,果然,指定的content-type是text/xml。 如下圖。我們知道,springmvc預設接收數據的格式是json方式序列化的。你指定成xml格式,顯然springmvc在反序列化成NotifyVO對象時會拋出異常。自然,就不會執行這個action方法了,所以,我們沒看到那條“收到回調----非同步回調----非同步通知----回調通知”log。

【題外話】關於springmvc的messageconverter設置,可以查看spirng-web.jar里的RestTemplate.java源碼。

Line122:jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);

 

接著說,我們讓這位開發同學改成 application/json 後,問題得以解決。

 

 

ButButBut,下午,QA在測試付款單的回調的時候,同樣的問題又出現了,我們接收不到請求報文。一看log,又是text/xml搞的鬼。B系統的這個付款回調是另一個同學開發的。考慮到目前已經有外部商戶接入B系統,他們不准備改了。

不改就不改吧,B系統他們不改,只好我們A系統改了。話說回來,即便他們現在不改,日後有其他商戶對接聯調時,也難免會出現類似的問題。那,就是以後的事兒了。

我們怎麼改呢?那就不直接從RequestBody里接收NotfiyVO對象了,改成接收String字元串。然後,在方法里來做判斷和反序列化。改後的代碼為:

    @PostMapping("/ayncNotify")
    @UnAuthToken
    public String ayncNotify(@RequestBody String notifyStr){
        log.info("收到回調----非同步回調----非同步通知----回調通知:{}", notifyStr);
        if(StringUtils.isBlank(notifyStr)){
            log.info("回調通知為空");
            return "ERROR-回調通知請求參數為空";
        }
        NotifyVO notifyVO = JSON.parseObject(notifyStr,NotifyVO.class);
        log.info("回調轉換NotifyVo:{}",notifyVO);
        String respText = taxNotifyService.ayncNotify(notifyVO);
        log.info("回調----非同步回調----非同步通知----回調通知 回寫內容:{}",respText);
        return respText;
    }

 

 

THE END.

下午得知,一同學在對接付款介面時,當付款介面返回受理失敗時,他把付款單的付款結果改成了失敗。這可要不得呀!付款結果一定要通過付款查詢介面來查。查詢返回付款成功,則付款成功;查詢返回付款失敗,則付款失敗;對於查詢到的其他結果,保守起見,都視為付款中即可,然後由人工來干預。技術人員千萬別自作主張,把某些不明確的結果定為付款失敗。萬一齣現重覆付款,那就尷尬了。我在2016年那時剛開始做聚合支付時,是有這樣的慘痛經歷的。

 

 ☞ Stay Hungry,Stay Foolish. 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有時候會遇到這種情況,某些屬性指向限制在特定範圍內,當別人調用的時候,只能賦值在這特定範圍內的值。這樣的情況有哪些呢?比如有一個屬性是用來放年齡的,那麼這個年齡就不能被設置為負數。還有人的性別隻有男跟女兩種選擇,別來一個雌雄同體。在這樣的情況下,就會用到封裝跟隱藏。 信息的封裝和隱藏 Java中通過 ...
  • 關閉防火牆,設置虛擬機和本機在同一網段,還是ping不同 解決方法:在VMware中點擊 編輯 >虛擬網路編輯器 >更改設置 >還原預設設置 然後重新配置虛擬機和本機在同一網段,關閉VMnet1,啟動VMnet8 ...
  • 軟體包:類似於電腦的文件管理方式,主要解決同名文件。 包幫助管理大型軟體系統:將語義類似的類組織到包中;解決類命名衝突的問題。 包可以包含類和子包。 關鍵字——package package語句作為Java源文件的第一條語句,指明該文件中定義的類所在的包。若預設該語句,則指定為無名包。 格式:pac ...
  • 目錄結構: —|controller —|Home.php —|model —|view —|welcome.php —|index.php 基本原理: 首頁 index.php 通過獲得地址欄中的路由名稱獲得對應控制器以及控制的方法名,通過require引入到index.php首頁中。通過引入的對 ...
  • 重載的概念 在同一個類中,允許存在一個以上的同名的方法,只要它們的參數個數或者參數類型不同的話就行。 重載的特點 與返回值類型無關,只看參數列表,且參數列表必須不同。(參數個數、參數類型、參數排列順序) 理解:就只要參數列表不要完全一樣就行。和返回值類型無關。 方法的可變個數的形參 在遇到不知道要給 ...
  • 前言 只有光頭才能變強。 文本已收錄至我的GitHub精選文章,歡迎Star : "https://github.com/ZhongFuCheng3y/3y" 相信大家對他也不陌生了,前後端交互中常常就以 來進行 數據交換 。而有的時候,我們也會將 直接保存在資料庫中。 可能就有人不太理解,為什麼要 ...
  • 昨天有使用soap傳輸數據到Webservice,其中字元串類型的都已經傳輸成功,但是有幾個參數傳輸失敗,java伺服器端收到的空值。 因為我是php的,然後接收端是java製作的,其中有幾個參數是list數組類型的,我剛開始將php的數組傳過去,服務端接收到的是空,然後再使用json格式還是不行。 ...
  • 第一次寫博客,本文主要源於圖像處理大作業,不足之處,還望指正。 1. Introduction (5%) The task of the project is to find the dial-code switch in the figure below and calibrate the rec ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...