对接印度股票数据获取印度股市列表、查询特定股票行情以及 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 消耗和提升响应速度。
相关文章
|
6天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
4755 7
|
14天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
20525 112
|
9天前
|
人工智能 API 网络安全
Mac mini × OpenClaw 保姆级配置教程(附阿里云/本地部署OpenClaw配置百炼API图文指南)
Mac mini凭借小巧机身、低功耗和稳定性能,成为OpenClaw(原Clawdbot)本地部署的首选设备——既能作为家用AI节点实现7×24小时运行,又能通过本地存储保障数据隐私,搭配阿里云部署方案,可灵活满足“长期值守”与“隐私优先”的双重需求。对新手而言,无需复杂命令行操作,无需专业技术储备,按本文步骤复制粘贴代码,即可完成OpenClaw的全流程配置,同时接入阿里云百炼API,解锁更强的AI任务执行能力。
6534 2
|
11天前
|
人工智能 安全 前端开发
Team 版 OpenClaw:HiClaw 开源,5 分钟完成本地安装
HiClaw 基于 OpenClaw、Higress AI Gateway、Element IM 客户端+Tuwunel IM 服务器(均基于 Matrix 实时通信协议)、MinIO 共享文件系统打造。
7904 6
|
12天前
|
人工智能 JavaScript API
保姆级教程:OpenClaw阿里云/本地部署配置Tavily Search skill 实时联网,让OpenClaw“睁眼看世界”
默认状态下的OpenClaw如同“闭门造车”的隐士,仅能依赖模型训练数据回答问题,无法获取实时新闻、最新数据或训练截止日期后的新信息。2026年,激活其联网能力的最优方案是配置Tavily Search技能——无需科学上网、无需信用卡验证,每月1000次免费搜索额度完全满足个人需求,搭配ClawHub技能市场,还能一键拓展天气查询、邮件管理等实用功能。
7550 5
|
6天前
|
JavaScript Linux API
保姆级教程,通过GACCode在国内使用Claudecode、Codex!
保姆级教程,通过GACCode在国内使用Claudecode、Codex!
3343 1
保姆级教程,通过GACCode在国内使用Claudecode、Codex!

热门文章

最新文章