<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      buguge - Keep it simple,stupid

      ? 知識(shí)就是力量,但更重要的,是運(yùn)用知識(shí)的能力? why buguge?

      導(dǎo)航

      聚合系統(tǒng)設(shè)計(jì):利用泛型來(lái)重構(gòu)三方服務(wù)的底層調(diào)用

      主流官媒都開始使用“標(biāo)題黨”這種網(wǎng)絡(luò)傳播套路了

      主流官媒都開始使用“標(biāo)題黨”這種網(wǎng)絡(luò)傳播套路了....適當(dāng)網(wǎng)絡(luò)化表達(dá)可增強(qiáng)傳播力,但過度追求流量易損害公信力。關(guān)鍵在于平衡,區(qū)分時(shí)政要聞與文化報(bào)道的傳播尺度,在創(chuàng)新形式的同時(shí)堅(jiān)守媒體責(zé)任,實(shí)現(xiàn)有效傳播與價(jià)值引領(lǐng)的統(tǒng)一。

      ↓↓↓以下為正文?!?/p>

      三方服務(wù)API接口響應(yīng)說(shuō)明

      我司通道服務(wù)里調(diào)用的一個(gè)三方服務(wù)商,其響應(yīng)結(jié)構(gòu)如下:

      字段名 類型 描述
      code int 業(yè)務(wù)響應(yīng)的 code 碼(非 HTTP 狀態(tài)碼)
      message string 返回值的狀態(tài)描述
      data obj 業(yè)務(wù)數(shù)據(jù),具體字段參考各 API 接口返回值

      這個(gè)標(biāo)準(zhǔn)化響應(yīng)格式,大家都比較熟悉。正常響應(yīng)時(shí),code=200,并將數(shù)據(jù)結(jié)果放到data里。非正常響應(yīng)時(shí),code是非200的錯(cuò)誤碼,data為空。

      • 示例

      錯(cuò)誤響應(yīng)示例:

      {"code": 400, "message": "手機(jī)號(hào)格式不正確"}
      
      {"code":404,"data":null,"message":"訂單不存在"}
      

      正確響應(yīng)示例:

      {
        "code": 200,
        "data": {
          "orderId": "ORD20250720001",
          "status": "已支付",
          "amount": 299.00
        },
        "message": "訂單查詢成功"
      }
      
      {"code":200,"message":"用戶簽約成功"}
      

      與之對(duì)應(yīng),我們程序里定義了相應(yīng)的模型類:

      @Data
      public class SanHeCommonResponse<T> implements Serializable {
          /** 業(yè)務(wù)響應(yīng)的code 碼(非HTTP 狀態(tài)碼) */
          private Integer code;
      
          /** 返回值的狀態(tài)描述 */
          private String message;
          
          /** 業(yè)務(wù)數(shù)據(jù),具體的字段內(nèi)容參考各個(gè)API 接口的返回值 */
          private T data;
      
          // 判斷響應(yīng)是否成功(code為200時(shí)表示成功)
          public boolean isSuccess(){
              return code == 200;
          }
      }
      

      三方服務(wù)底層調(diào)用封裝——execute方法及實(shí)現(xiàn)

      三方服務(wù)API對(duì)接層中,我們將數(shù)據(jù)加密/簽名、http通信、驗(yàn)簽/數(shù)據(jù)解密等通用性功能封裝在底層,見下面的execute方法如下。注意,后面我們重點(diǎn)要談針對(duì)這個(gè)方法的重構(gòu)。

      /**
       * 安**宇服務(wù)商接口通信(含請(qǐng)求及響應(yīng))封裝
       */
      public static SanHeCommonResponse execute(NewSanHeApiEnum apiEnum, String token) {
          SanHeCommonRequest requestBody = new SanHeCommonRequest();
          requestBody.setNonceStr(RandomUtil.randomString(10));
          requestBody.setData...
      
          JSONObject requestParams = JSON.parseObject(JSON.toJSONString(requestBody));
          HttpEntity<Object> requestEntity;
          HttpHeaders headers = new HttpHeaders();
          headers.add("x-access-token", token);
          requestEntity = new HttpEntity<>(requestParams, headers);
          RestTemplate restTemplate = new RestTemplate();
          String body;
          try {
              url = url.concat(apiEnum.getUrl());
              ResponseEntity<String> response = restTemplate.exchange(API_URL, HttpMethod.POST, requestEntity, String.class);
              body = response.getBody();
          } catch (Exception ex) {
              log.error("安**宇接口調(diào)用異常:", ex);
              throw BizException.build("接口調(diào)用異常");
          }
          SanHeCommonResponse sanHeCommonResponse = JSON.parseObject(body, SanHeCommonResponse.class);
          if (!sanHeCommonResponse.isSuccess()) {
              throw BizException.build(sanHeCommonResponse.getCode(), sanHeCommonResponse.getMessage());
          }
          return sanHeCommonResponse;
      }
      



      execute方法返回值重構(gòu)

      OOP程序設(shè)計(jì)的一個(gè)重要思想是明確對(duì)象的職責(zé)。

      針對(duì)這種三方服務(wù)對(duì)接的需求場(chǎng)景,我們需要把握好一個(gè)設(shè)計(jì)理念:將三方服務(wù)調(diào)用涉及的數(shù)據(jù)加密/簽名、http通信、驗(yàn)簽/數(shù)據(jù)解密等通用性功能封裝在底層,使上層的接口處理方法專注于接口數(shù)據(jù)的邏輯處理。

      這個(gè)execute方法在返回值方面存在的問題是:調(diào)用方需要通過SanHeCommonResponse.data獲取并轉(zhuǎn)換為實(shí)際業(yè)務(wù)數(shù)據(jù),這增加了編碼成本。

      SanHeCommonResponse response = execute(API_ORDER, token);
      if (!response.isSuccess()) {
          throw new BizException("查詢失敗");
      }
      OrderResponse data = JSON.parseObject(response.getData().toString(), OrderResponse.class);
      

      針對(duì)返回值方面的這個(gè)問題,重構(gòu)結(jié)果如下:

      /**
       * 安**宇服務(wù)商接口通信(含請(qǐng)求及響應(yīng))封裝
       */
      public static <T> T SanHeCommonResponse execute(NewSanHeApiEnum apiEnum, String token, Class<T> clazz) {
          ...
          
          SanHeCommonResponse<JSONObject> sanHeCommonResponse = JSON.parseObject(body, new TypeReference<SanHeCommonResponse<JSONObject>>(){});//用`new TypeReference<SanHeCommonResponse<JSONObject>>(){}`來(lái)解析帶有泛型的響應(yīng), 避免IDE類型轉(zhuǎn)換警告。
          if (!sanHeCommonResponse.isSuccess()) {
              throw BizException.build(sanHeCommonResponse.getCode(), sanHeCommonResponse.getMessage());
          }
      
          return Optional.ofNullable(sanHeCommonResponse.getData())
                  .orElse(new JSONObject())
                  .toJavaObject(clazz);
      }
      

      這時(shí),上層調(diào)用直接一行代碼搞定:

      OrderResponse data = execute(API_ORDER, token, OrderResponse.class);
      



      重構(gòu)的目的是使方法更通用,能夠直接返回業(yè)務(wù)數(shù)據(jù)對(duì)象,而不是整個(gè)SanHeCommonResponse對(duì)象。通過使用泛型,讓調(diào)用者可以指定期望返回的業(yè)務(wù)數(shù)據(jù)類型,將類型安全性提前至編譯期,有效增強(qiáng)程序健壯性。

      posted on 2025-07-28 09:25  buguge  閱讀(73)  評(píng)論(0)    收藏  舉報(bào)

      主站蜘蛛池模板: 福利一区二区在线观看| 国产精品免费重口又黄又粗| 性欧美牲交在线视频| 国产精品免费无遮挡无码永久视频| 久久精品波多野结衣| 精品蜜臀国产av一区二区| 久久天天躁狠狠躁夜夜2020老熟妇| 99riav精品免费视频观看| 久久夜色撩人国产综合av| 欧美成aⅴ人高清免费| 婷婷成人丁香五月综合激情| 少妇又爽又刺激视频| 亚洲av无码精品色午夜蛋壳| 国产精品一区二区性色av| 少妇高潮毛片免费看| 欧美视频精品免费覌看| 大胸美女吃奶爽死视频| 欧美成人www免费全部网站 | 激情综合网激情五月我去也| 亚洲无线观看国产精品| 欧美粗大猛烈老熟妇| V一区无码内射国产| 一区二区三区成人| 四虎国产精品永久入口| 欧美成人看片一区二区三区尤物| 天干天干夜天干天天爽| 中文无码乱人伦中文视频在线| 国产精品欧美一区二区三区不卡| 欧美级特黄aaaaaa片| 亚洲精品日韩在线观看| 少妇人妻av无码专区| 国产真实交换配乱婬95视频| 免费无码AV一区二区波多野结衣| 国产成人午夜福利精品| 久久这里都是精品一区| 亚洲熟妇AV午夜无码不卡| 99亚洲男女激情在线观看| 欧美日韩国产综合草草| 成在人线av无码免费高潮水老板| 小嫩批日出水无码视频免费| 一区二区三区久久精品国产|