Java は http リクエストを通じて他の人のインターフェースを呼び出します

この関数の実装はすべてこのブログに基づいています。この偉大なマスターに感謝の意を表します。

Java を使用して Spring Boot に基づいて http リクエストを呼び出す 6 つの方法

ビジネスの背景

私の部門のプロジェクト (公式 Web サイトのプロジェクト) は、http リクエストを使用して他の部門のインターフェイス (マイクロサービス プロジェクト) を呼び出す必要があります。まず、他の部門からの http リクエストのパラメータと戻りデータを見てみましょう。以下に示すように
ここに画像の説明を挿入します

最初のステップは URL を設定することです

ここでの http リクエストの URL は本番環境とテスト環境で異なるため、管理を容易にするために yml 設定項目として URL 設定を使用します。

offerBuyBack:
   url: http://zuul.mircroservice-dev.10.xxx.xx.xx.nip.io/v1.0/StockService/function523

ここに画像の説明を挿入します
yml設定の読み取り

@Value ("${offerBuyBack.url}")
private String url;

2 番目のステップは、リクエスト本文 RequestBody をカプセル化することです。

ビジネスの背景から、HTTP リクエスト本文の Json 形式は次のとおりであることがわかっています。

{
    
    
    "params":{
    
    
        "secu_code":"",
        "market":"00"
    }
}

也就是说“params”是数据头,params下又包含了多个像“market”这样的字段的参数。

我是这样理解的:这里的请求体是一个有键值对的对象,params是key,而value就是实体对象。value里又封装了各种需要传递的参数属性,像market这样的属性等....

したがって、カプセル化した値オブジェクトはエンティティ クラス「F523OutputVo」であり、これはパッケージを返すために使用する VO オブジェクトでもあります。

public class F523OutputVo {
    
    
    String bond_name = "";
    String last_rate = "";
    String call_rate = "";
    String market = "";
    String bond_bal_amt = "";
    
    省略set和get方法...
}

最後に、F523OutputVo オブジェクトを params にネストします。

public class OfferBuyBack {
    
    

    private F523OutputVo params;

    public F523OutputVo getParams() {
    
    
        return params;
    }

    public void setParams(F523OutputVo params) {
    
    
        this.params = params;
    }
}

3 番目のステップは、HttpURLConnection を使用してサーバー側で POST リクエストを呼び出すことです。

冒頭に転載したブログリンクより抜粋

/**
  * 1.使用HttpURLConnection调用服务端的POST请求
  * 服务端入参注解: @RequestBody
  */
 public static void f1() throws Exception {
    
    
   // 1.请求URL
   String postUrl = "http://127.0.0.1:19091/server/comm/f1";
   // 2.请求参数JSON格式
   Map<String, String> map = new HashMap<>();
   map.put("userName", "HangZhou20220718");
   map.put("tradeName", "Vue进阶教程");
   String json = JSON.toJSONString(map);
   // 3.创建连接与设置连接参数
   URL urlObj = new URL(postUrl);
   HttpURLConnection httpConn = (HttpURLConnection) urlObj.openConnection();
   httpConn.setRequestMethod("POST");
   httpConn.setRequestProperty("Charset", "UTF-8");
   // POST请求且JSON数据,必须设置
   httpConn.setRequestProperty("Content-Type", "application/json");
   // 打开输出流,默认是false
   httpConn.setDoOutput(true);
   // 打开输入流,默认是true,可省略
   httpConn.setDoInput(true);
   // 4.从HttpURLConnection获取输出流和写数据
   OutputStream oStream = httpConn.getOutputStream();
   oStream.write(json.getBytes());
   oStream.flush();
   // 5.发起http调用(getInputStream触发http请求)
   if (httpConn.getResponseCode() != 200) {
    
    
       throw new Exception("调用服务端异常.");
   }
   // 6.从HttpURLConnection获取输入流和读数据
   BufferedReader br = new BufferedReader(
           new InputStreamReader(httpConn.getInputStream()));
   String resultData = br.readLine();
   System.out.println("从服务端返回结果: " + resultData);
   // 7.关闭HttpURLConnection连接
   httpConn.disconnect();
 }

————————————————
版权声明:本文为CSDN博主「zhangbeizhen18」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangbeizhen18/article/details/125899199

4 番目のステップは、独自のコードを変更することです

上記のブロガーのコードを参照した後、自分のコードを修正しました

@Controller
@Api(tags = "报价回购 StockService服务  523 接口")
@RequestMapping("/offerBuyBack")
public class OfferBuyBackController {
    
    

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value ("${offerBuyBack.url}")
    private String url;

    @RequestMapping(value = "/getBuyBackInfo",method = RequestMethod.POST)
    @ResponseBody
    public ServerResponse offerBuyBack(@RequestBody OfferBuyBack offerBuyBack){
    
    
        List<F523OutputVo> f523OutputVos= null;

        // 1.请求URL
        String postUrl = url;
        // 2.请求参数JSON格式
        String json = null;

        try {
    
    
            json = JSON.toJSONString(offerBuyBack);

            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(json);
            //校验market的传参范围
            String market =jsonNode.findPath("market").asText();
            if(!StringUtils.isEmpty(market)){
    
    
                if(!"00".equals(market) && !"10".equals(market)){
    
    
                    throw new Exception("参数错误");
                }
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
            return ServerResponse.createByErrorMessage("请求参数有误!");
        }

        HttpURLConnection httpConn = null;
        JSONArray obj = null;

        try {
    
    
            // 3.创建连接与设置连接参数
            URL urlObj = new URL(postUrl);
            httpConn = (HttpURLConnection) urlObj.openConnection();
            httpConn.setRequestMethod("POST");
            httpConn.setRequestProperty("Charset", "UTF-8");
            // POST请求且JSON数据,必须设置
            httpConn.setRequestProperty("Content-Type", "application/json");
            // 打开输出流,默认是false
            httpConn.setDoOutput(true);
            // 打开输入流,默认是true,可省略
            httpConn.setDoInput(true);
            // 4.从HttpURLConnection获取输出流和写数据
            OutputStream oStream = httpConn.getOutputStream();
            oStream.write(json.getBytes());
            oStream.flush();
            // 5.发起http调用(getInputStream触发http请求)
            if (httpConn.getResponseCode() != 200) {
    
    
                throw new Exception("调用服务端异常.");
            }
            // 6.从HttpURLConnection获取输入流和读数据
            BufferedReader br = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
            String resultData = br.readLine();
            logger.info("从服务端返回结果: " + resultData);
            JSONObject appleJsonObject= JSONObject.parseObject(resultData);

            obj = (JSONArray) appleJsonObject.get("data");
            if(obj.size()==0){
    
    
                return ServerResponse.createByErrorMessage("微服务查询结果报错!");
            }
            //定义需要显示的Vo对象
            F523OutputVo f523OutputVo = null;
            f523OutputVos = new ArrayList<>();
            for(int i= 0;i<obj.size();i++){
    
    
                f523OutputVo =new F523OutputVo();
                f523OutputVo.setBond_name((String) obj.getJSONObject(i).get("bond_name"));
                f523OutputVo.setCall_rate((String) obj.getJSONObject(i).get("call_rate"));
                f523OutputVo.setLast_rate((String) obj.getJSONObject(i).get("last_rate"));
                f523OutputVo.setMarket((String) obj.getJSONObject(i).get("market"));
                f523OutputVo.setBond_bal_amt((String)obj.getJSONObject(i).get("bond_bal_amt"));
                f523OutputVos.add(f523OutputVo);
            }
            // 7.关闭HttpURLConnection连接
            httpConn.disconnect();
            return ServerResponse.createBySuccess("成功",f523OutputVos);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return  ServerResponse.createByErrorMessage("请求失败");
    }
}

ステップ 5: リクエストプロセスを分析する

ここに画像の説明を挿入します

1.JSON.toJSONString(offerBuyBack)

ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. データ インターフェイスを json 形式で読み取り、フロントエンド パラメーターを確認します。

ここに画像の説明を挿入します

3. URL で作成された接続の接続パラメータを設定します。

ここに画像の説明を挿入します

4. リクエストURLにリクエストパラメータを記述する

ここに画像の説明を挿入します

5. http 呼び出しを開始します (getInputStream が http リクエストをトリガーします)

ここに画像の説明を挿入します

6. データを読み取るための入力ストリームを取得する

ここに画像の説明を挿入します

7. 返されたデータをフォーマットする

ここに画像の説明を挿入します

8. 返される必要があるオブジェクト属性に従って、対応するフィールドを走査して取得します。

ここに画像の説明を挿入します

9. HttpURLConnection 接続を閉じます。

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/flytalei/article/details/132812760