FAQ > 金融建模 > 第三方交互 > TS-OPI

Q:Java&OPI方式调用示例:调用天软函数    

  • A:本文中主要展示开发者用户在Java通过OPI接口调用天软函数的具体实现,即使用URI:/Service/Call/funcName。
    下面示例中,主要展示调用天软范例函数(公用函数):GetTimeSeriesSample(BegT,EndT,StockId,cycle)
    功能:获取指定个股在时间区间内每日价格,及30日均价

    范例代码:获取SZ000002指定日期区间行情指标数据
    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.nio.charset.StandardCharsets;
    import java.time.LocalDateTime;
    import java.time.temporal.ChronoUnit;
    import java.util.Base64;

    public class ModernJavaTinySoftClient {

      private static final LocalDateTime TSL_EPOCH = LocalDateTime.of(1899, 12, 30, 0, 0, 0);

      public static void main(String[] args) {
        try {
          String url = "https://opi.tinysoft.com.cn/Service/Call/GetTimeSeriesSample";
          String username = "user"; // 替换账号
          String password = "password"; // 替换密码

          // 1. 准备数据
          double begT = javaDateToTsl(LocalDateTime.of(2026, 3, 25, 0, 0, 0));
          double endT = javaDateToTsl(LocalDateTime.of(2026, 4, 10, 0, 0, 0));
          
          // 手动构建 JSON 数组字符串
          String jsonBody = String.format("[%.10f, %.10f, \"SZ000002\", \"日线\"]", begT, endT);


          // 2. 构建 Basic Auth
          String auth = username + ":" + password;
          String basicAuth = "Basic " + Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.ISO_8859_1));

          // 3. 创建 HttpClient (Java 11+ 原生,无警告,无依赖)
          HttpClient client = HttpClient.newHttpClient();

          // 4. 构建请求
          HttpRequest request = HttpRequest.newBuilder()
              .uri(URI.create(url)) // 使用 URI.create,无弃用警告
              .header("Content-Type", "application/json")
              .header("TS-EVENTNAME", "auto")
              .header("JSON-Encode", "gbk")
              .header("Authorization", basicAuth)
              // 【关键】添加 User-Agent,防止 403
              .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
              .POST(HttpRequest.BodyPublishers.ofString(jsonBody, StandardCharsets.UTF_8))
              .build();

          // 5. 发送请求
          HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

          System.out.println("状态码: " + response.statusCode());
          System.out.println("响应: " + response.body());

        } catch (Exception e) {
          e.printStackTrace();
        }
      }

      public static double javaDateToTsl(LocalDateTime dt) {
        long days = ChronoUnit.DAYS.between(TSL_EPOCH, dt);
        long seconds = dt.getHour() * 3600L + dt.getMinute() * 60L + dt.getSecond();
        return days + (seconds / 86400.0);
      }
    }
    执行结果: