对接印度股票数据获取印度股市列表、查询特定股票行情以及 K 线历史数据

简介: 本项目基于Spring Boot 3.x,集成OkHttp3与Jackson,专注印度股市(NSE/BSE)行情服务:支持获取股票列表、实时报价及K线历史数据。代码规范、异常完备、配置分离,含详细注释与生产级设计(如自动资源释放、字段容错、统一响应封装),便于快速扩展与维护。(239字)

本代码采用 Spring Boot 3.x + OkHttp3 + Jackson 技术栈,重点展示了如何获取印度股市列表、查询特定股票行情以及 K 线历史数据。代码遵循生产级规范,包含完整的异常处理、配置分离和详细注释。

1. 核心数据模型 (POJO)

首先定义通用的响应结构和股票行情数据模型。

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.util.List;

/**
 * 通用响应包装类
 */
@Data
public class ApiResponse<T> {
   
    private int code;
    private String message;
    private T data;
}

/**
 * 股票行情数据模型
 */
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class StockQuote {
   
    private Long id;           // 产品唯一标识 (PID)
    private String name;       // 股票名称
    private String symbol;     // 股票代码
    private Double last;       // 最新价
    private Double high;       // 最高价
    private Double low;        // 最低价
    private Double chg;        // 涨跌额
    private Double chgPct;     // 涨跌百分比
    private Long time;         // 时间戳
    private String flag;       // 国家简称 (印度为 IN)
    private Integer countryId; // 国家ID (印度为 14)
}

/**
 * K线数据模型
 */
@Data
public class KlineData {
   
    private Long time;
    private Double open;
    private Double high;
    private Double low;
    private Double close;
    private Long volume;
}

2. 业务服务类 (Service)

封装 OkHttp 调用逻辑,专门针对印度市场(countryId=14)进行优化。

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Collections;
import java.util.List;

@Service
public class IndiaStockService {
   

    private final OkHttpClient httpClient;
    private final ObjectMapper objectMapper;

    // 配置参数
    private static final String BASE_URL = "https://api.stocktv.top";
    private static final String API_KEY = "您的API_KEY"; // 请联系官方获取
    private static final String INDIA_COUNTRY_ID = "14"; // 印度国家标识

    public IndiaStockService(OkHttpClient httpClient, ObjectMapper objectMapper) {
   
        this.httpClient = httpClient;
        this.objectMapper = objectMapper;
    }

    /**
     * 获取印度股市列表
     * @param page 页码
     * @param size 每页数量
     */
    public List<StockQuote> getIndiaMarketList(int page, int size) {
   
        HttpUrl url = HttpUrl.parse(BASE_URL + "/stock/stocks").newBuilder()
                .addQueryParameter("countryId", INDIA_COUNTRY_ID)
                .addQueryParameter("page", String.valueOf(page))
                .addQueryParameter("pageSize", String.valueOf(size))
                .addQueryParameter("key", API_KEY)
                .build();

        return executeRequest(url, new TypeReference<ApiResponse<PaginationData<StockQuote>>>() {
   })
                .map(res -> res.getData().getRecords())
                .orElse(Collections.emptyList());
    }

    /**
     * 获取 K 线历史数据
     * @param pid 股票产品ID
     * @param interval 时间周期 (PT1M, PT1H, P1D 等)
     */
    public List<KlineData> getStockKline(Long pid, String interval) {
   
        HttpUrl url = HttpUrl.parse(BASE_URL + "/stock/kline").newBuilder()
                .addQueryParameter("pid", String.valueOf(pid))
                .addQueryParameter("interval", interval)
                .addQueryParameter("key", API_KEY)
                .build();

        return executeRequest(url, new TypeReference<ApiResponse<List<KlineData>>>() {
   })
                .map(ApiResponse::getData)
                .orElse(Collections.emptyList());
    }

    /**
     * 通用 HTTP 请求执行与异常处理
     */
    private <T> java.util.Optional<T> executeRequest(HttpUrl url, TypeReference<T> typeReference) {
   
        Request request = new Request.Builder().url(url).get().build();

        try (Response response = httpClient.newCall(request).execute()) {
   
            if (!response.isSuccessful() || response.body() == null) {
   
                // 此处应接入日志系统记录错误
                return java.util.Optional.empty();
            }

            String body = response.body().string();
            return java.util.Optional.ofNullable(objectMapper.readValue(body, typeReference));
        } catch (IOException e) {
   
            // 异常处理逻辑,如重试或报警
            e.printStackTrace();
            return java.util.Optional.empty();
        }
    }
}

3. 技术要点说明

  1. 参数规范化:针对印度市场,代码中硬编码了 countryId = 14,确保所有请求均精准定位到印度证券交易所(NSE/BSE)的数据。
  2. 资源管理:使用 Java 7+ 的 try-with-resources 确保 Response 对象在使用完毕后及时关闭,防止 Socket 连接泄漏。
  3. 健壮性
  • 引入 Jackson@JsonIgnoreProperties(ignoreUnknown = true),避免 API 升级增加新字段时导致反序列化崩溃。
  • 通过 ApiResponse<T> 统一处理 API 的业务状态码(code: 200)。
  1. 可扩展性:提供了通用的 executeRequest 私有方法,方便后续快速增加“涨跌榜”、“IPO日历”等新接口的对接。

4. 快速运行建议

  • 依赖:在 pom.xml 中添加 okhttp (4.x), jackson-databind, 和 lombok
  • Key 获取:必须联系 API 提供方获取有效的 key,否则请求将返回认证失败。
  • 频率限制:生产环境下建议对调用增加速率限制(Rate Limiting),并针对行情数据增加本地缓存(如 Redis),以减少 API 消耗和提升响应速度。
相关文章
|
2月前
|
缓存 JSON API
玩转纳斯达克与纽交所:美股数据 API 对接全指南
本文手把手教你用StockTV API对接美股(NYSE/NASDAQ)实时行情、专业K线及IPO数据,支持WebSocket极速推送、多维技术指标与全交易所覆盖,助你快速构建低延迟量化交易或金融App。(239字)
|
2月前
|
机器学习/深度学习 开发者 内存技术
阶跃星辰 Step 3.5 Flash 预训练/中训练/训练框架全部开源!
阶跃星辰开源Step 3.5 Flash——迄今最强开源Agent基座模型,含Base/Midtrain权重及Steptron全栈训练框架,支持预训练、SFT与强化学习,专为智能体设计。已登OpenRouter榜首,获社区广泛好评。(239字)
589 22
|
2月前
|
JSON API PHP
使用PHP对接美股股票市场API 实时数据、IPO和K线(Kline)的PHP对接方案
StockTV API 面向开发者,提供美股实时行情、历史K线(5分钟至1月)、IPO日历等数据,支持HTTP/WS双接入,全接口返回标准JSON,含纽交所(ex=1)与纳斯达克(ex=2)标识。(239字)
|
2月前
|
人工智能 数据安全/隐私保护
五分钟配好向日葵 MCP,让 AI 替你远程安装 OpenClaw!
本文详解向日葵MCP的实战配置与应用:将远程控制能力接入AI,实现“一句话操作另一台电脑”。支持截图查看桌面、自动打开浏览器搜索、远程执行命令等,无需写脚本,配置简单,即刻上手。
813 12
五分钟配好向日葵 MCP,让 AI 替你远程安装 OpenClaw!

热门文章

最新文章