package com.xcong.excoin.modules.okxApi; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; @Slf4j public class OkxRestClient { private final String baseUrl; private final String apiKey; private final String secretKey; private final String passphrase; private final boolean isSimulate; public OkxRestClient(String baseUrl, String apiKey, String secretKey, String passphrase, boolean isSimulate) { this.baseUrl = baseUrl; this.apiKey = apiKey; this.secretKey = secretKey; this.passphrase = passphrase; this.isSimulate = isSimulate; } public boolean setPositionMode(String posMode) { JSONObject params = new JSONObject(); params.put("posMode", posMode); JSONObject result = post("/api/v5/account/set-position-mode", params); return isSuccess(result, "设置持仓方式"); } public boolean setLeverage(String instId, String lever, String mgnMode) { JSONObject params = new JSONObject(); params.put("instId", instId); params.put("lever", lever); params.put("mgnMode", mgnMode); JSONObject result = post("/api/v5/account/set-leverage", params); return isSuccess(result, "设置杠杆"); } private JSONObject post(String path, JSONObject body) { HttpURLConnection conn = null; try { String bodyStr = body.toJSONString(); String timestamp = OkxWsUtil.getIso8601Timestamp(); String sign = OkxWsUtil.signRest(timestamp, "POST", path, bodyStr, secretKey); URL url = new URL(baseUrl + path); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setConnectTimeout(15000); conn.setReadTimeout(15000); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("OK-ACCESS-KEY", apiKey); conn.setRequestProperty("OK-ACCESS-SIGN", sign); conn.setRequestProperty("OK-ACCESS-TIMESTAMP", timestamp); conn.setRequestProperty("OK-ACCESS-PASSPHRASE", passphrase); if (isSimulate) { conn.setRequestProperty("x-simulated-trading", "1"); } try (OutputStream os = conn.getOutputStream()) { os.write(bodyStr.getBytes(StandardCharsets.UTF_8)); os.flush(); } int code = conn.getResponseCode(); String response = readResponse(conn); log.info("[REST] POST {} → HTTP {} body:{}", path, code, response); return JSON.parseObject(response); } catch (Exception e) { log.error("[REST] POST {} 失败: {}", path, e.getMessage()); return null; } finally { if (conn != null) { conn.disconnect(); } } } private String readResponse(HttpURLConnection conn) throws Exception { StringBuilder sb = new StringBuilder(); String line; if (conn.getResponseCode() >= 200 && conn.getResponseCode() < 300) { try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { while ((line = br.readLine()) != null) { sb.append(line); } } } else { try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8))) { while ((line = br.readLine()) != null) { sb.append(line); } } } return sb.toString(); } private boolean isSuccess(JSONObject result, String label) { if (result == null) { log.error("[REST] {}失败: 无响应", label); return false; } String code = result.getString("code"); if ("0".equals(code)) { log.info("[REST] {}成功", label); return true; } if ("59000".equals(code)) { log.info("[REST] {}已设置(59000:配置未变更)", label); return true; } log.error("[REST] {}失败, code:{}, msg:{}", label, code, result.getString("msg")); return false; } }