StockAPI量化数据接口对接 Python、Java、PHP、C++、C#、C、NodeJs 请求示例

StockAPI量化数据接口对接 Python、Java、PHP、C++、C#、C、NodeJs 请求示例

StockAPI 多语言请求示例

本文提供了使用不同编程语言对接 StockAPI 的示例代码。StockAPI 提供了股票数据接口,支持通过 HTTP GET 请求获取 JSON 格式的响应数据。

API 接口信息

基本信息

  • 接口地址: https://www.stockapi.***.***/v1/base/day
  • 请求方式: GET
  • 返回格式: JSON

请求参数

参数名 类型 必填 说明
token string API访问令牌
code string 股票代码(如:600004)
startDate string 开始日期(格式:YYYY-MM-DD)
endDate string 结束日期(格式:YYYY-MM-DD)
calculationCycle int 计算周期

完整请求 URL 示例

https://www.stockapi.***.***/v1/base/day?token=你的token&code=600004&endDate=2021-10-15&startDate=2021-10-10&calculationCycle=100

text

Python 示例代码

方法一:使用 requests 库

import requests
import json

# API 配置
base_url = "https://www.stockapi.***.***/v1/base/day"
token = "你的token"  # 请替换为实际的token

# 请求参数
params = {
    "token": token,
    "code": "600004",
    "startDate": "2021-10-10",
    "endDate": "2021-10-15",
    "calculationCycle": 100
}

try:
    # 发送GET请求
    response = requests.get(base_url, params=params)
    
    # 检查响应状态
    if response.status_code == 200:
        data = response.json()
        print("请求成功!")
        print(json.dumps(data, indent=2, ensure_ascii=False))
    else:
        print(f"请求失败,状态码:{response.status_code}")
        print(f"响应内容:{response.text}")
        
except requests.exceptions.RequestException as e:
    print(f"请求异常:{e}")

方法二:使用 urllib 库(Python 标准库)


import urllib.request
import urllib.parse
import json

# API 配置
base_url = "https://www.stockapi.***.***/v1/base/day"
token = "你的token"  # 请替换为实际的token

# 请求参数
params = {
    "token": token,
    "code": "600004",
    "startDate": "2021-10-10",
    "endDate": "2021-10-15",
    "calculationCycle": 100
}

# 构建完整的URL
query_string = urllib.parse.urlencode(params)
full_url = f"{base_url}?{query_string}"

try:
    # 发送GET请求
    with urllib.request.urlopen(full_url) as response:
        data = json.loads(response.read().decode('utf-8'))
        print("请求成功!")
        print(json.dumps(data, indent=2, ensure_ascii=False))
        
except urllib.error.HTTPError as e:
    print(f"HTTP错误:{e.code} - {e.reason}")
except urllib.error.URLError as e:
    print(f"URL错误:{e.reason}")
except Exception as e:
    print(f"其他错误:{e}")
      

Java 示例代码

方法一:使用 HttpURLConnection(Java 标准库)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.***.HttpURLConnection;
import java.***.URL;
import java.***.URLEncoder;
import java.nio.charset.StandardCharsets;

public class StockApiDemo {
    private static final String BASE_URL = "https://www.stockapi.***.***/v1/base/day";
    private static final String TOKEN = "你的token"; // 请替换为实际的token
    
    public static void main(String[] args) {
        try {
            // 构建请求参数
            String params = "token=" + URLEncoder.encode(TOKEN, StandardCharsets.UTF_8) +
                           "&code=" + URLEncoder.encode("600004", StandardCharsets.UTF_8) +
                           "&startDate=" + URLEncoder.encode("2021-10-10", StandardCharsets.UTF_8) +
                           "&endDate=" + URLEncoder.encode("2021-10-15", StandardCharsets.UTF_8) +
                           "&calculationCycle=" + URLEncoder.encode("100", StandardCharsets.UTF_8);
            
            // 创建URL对象
            URL url = new URL(BASE_URL + "?" + params);
            
            // 创建HTTP连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("A***ept", "application/json");
            connection.setRequestProperty("User-Agent", "Java-StockAPI-Client/1.0");
            
            // 获取响应码
            int responseCode = connection.getResponseCode();
            
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // 读取响应内容
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
                StringBuilder response = new StringBuilder();
                String line;
                
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                reader.close();
                
                System.out.println("请求成功!");
                System.out.println("响应内容:" + response.toString());
            } else {
                System.out.println("请求失败,状态码:" + responseCode);
                
                // 读取错误响应
                BufferedReader errorReader = new BufferedReader(
                    new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
                StringBuilder errorResponse = new StringBuilder();
                String errorLine;
                
                while ((errorLine = errorReader.readLine()) != null) {
                    errorResponse.append(errorLine);
                }
                errorReader.close();
                
                System.out.println("错误内容:" + errorResponse.toString());
            }
            
            connection.disconnect();
            
        } catch (IOException e) {
            System.err.println("请求异常:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

方法二:使用 OkHttp 库(推荐)


import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.HttpUrl;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class StockApiOkHttpDemo {
    private static final String BASE_URL = "https://www.stockapi.***.***/v1/base/day";
    private static final String TOKEN = "你的token"; // 请替换为实际的token
    
    public static void main(String[] args) {
        // 创建OkHttp客户端
        OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();
        
        try {
            // 构建URL和参数
            HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL).newBuilder();
            urlBuilder.addQueryParameter("token", TOKEN);
            urlBuilder.addQueryParameter("code", "600004");
            urlBuilder.addQueryParameter("startDate", "2021-10-10");
            urlBuilder.addQueryParameter("endDate", "2021-10-15");
            urlBuilder.addQueryParameter("calculationCycle", "100");
            
            String url = urlBuilder.build().toString();
            
            // 创建请求
            Request request = new Request.Builder()
                .url(url)
                .addHeader("A***ept", "application/json")
                .addHeader("User-Agent", "Java-OkHttp-StockAPI-Client/1.0")
                .build();
            
            // 执行请求
            try (Response response = client.newCall(request).execute()) {
                if (response.isSu***essful()) {
                    String responseBody = response.body().string();
                    System.out.println("请求成功!");
                    System.out.println("响应内容:" + responseBody);
                } else {
                    System.out.println("请求失败,状态码:" + response.code());
                    System.out.println("错误内容:" + response.body().string());
                }
            }
            
        } catch (IOException e) {
            System.err.println("请求异常:" + e.getMessage());
            e.printStackTrace();
        } finally {
            // 关闭客户端连接池
            client.dispatcher().executorService().shutdown();
            client.connectionPool().evictAll();
        }
    }
}

Maven 依赖配置

如果使用 OkHttp 库,需要在 pom.xml 中添加以下依赖:


<dependency>
    <groupId>***.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>
      

Gradle 依赖配置

如果使用 Gradle,在 build.gradle 中添加:

implementation '***.squareup.okhttp3:okhttp:4.12.0'

PHP 示例代码

方法一:使用 cURL


<?php
// API 配置
$baseUrl = "https://www.stockapi.***.***/v1/base/day";
$token = "你的token"; // 请替换为实际的token

// 请求参数
$params = [
    'token' => $token,
    'code' => '600004',
    'startDate' => '2021-10-10',
    'endDate' => '2021-10-15',
    'calculationCycle' => 100
];

// 构建完整URL
$url = $baseUrl . '?' . http_build_query($params);

// 初始化cURL
$ch = curl_init();

// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-StockAPI-Client/1.0');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'A***ept: application/json',
    'Content-Type: application/json'
]);

// 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);

// 关闭cURL
curl_close($ch);

// 处理响应
if ($error) {
    echo "请求错误: " . $error . "\n";
} elseif ($httpCode === 200) {
    echo "请求成功!\n";
    $data = json_decode($response, true);
    echo "响应内容: " . json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
} else {
    echo "请求失败,状态码: " . $httpCode . "\n";
    echo "响应内容: " . $response . "\n";
}
?>
      

方法二:使用 file_get_contents


<?php
// API 配置
$baseUrl = "https://www.stockapi.***.***/v1/base/day";
$token = "你的token"; // 请替换为实际的token

// 请求参数
$params = [
    'token' => $token,
    'code' => '600004',
    'startDate' => '2021-10-10',
    'endDate' => '2021-10-15',
    'calculationCycle' => 100
];

// 构建完整URL
$url = $baseUrl . '?' . http_build_query($params);

// 创建上下文
$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => [
            'A***ept: application/json',
            'User-Agent: PHP-StockAPI-Client/1.0'
        ],
        'timeout' => 30
    ]
]);

// 发送请求
$response = @file_get_contents($url, false, $context);

if ($response === false) {
    echo "请求失败\n";
    $error = error_get_last();
    echo "错误信息: " . $error['message'] . "\n";
} else {
    echo "请求成功!\n";
    $data = json_decode($response, true);
    echo "响应内容: " . json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
}
?>

方法三:使用 Guzzle HTTP 库


<?php
require_once 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

// API 配置
$baseUrl = "https://www.stockapi.***.***/v1/base/day";
$token = "你的token"; // 请替换为实际的token

// 请求参数
$params = [
    'token' => $token,
    'code' => '600004',
    'startDate' => '2021-10-10',
    'endDate' => '2021-10-15',
    'calculationCycle' => 100
];

// 创建HTTP客户端
$client = new Client([
    'timeout' => 30,
    'headers' => [
        'A***ept' => 'application/json',
        'User-Agent' => 'PHP-Guzzle-StockAPI-Client/1.0'
    ]
]);

try {
    // 发送GET请求
    $response = $client->get($baseUrl, [
        'query' => $params
    ]);
    
    if ($response->getStatusCode() === 200) {
        echo "请求成功!\n";
        $body = $response->getBody()->getContents();
        $data = json_decode($body, true);
        echo "响应内容: " . json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
    } else {
        echo "请求失败,状态码: " . $response->getStatusCode() . "\n";
        echo "响应内容: " . $response->getBody()->getContents() . "\n";
    }
    
} catch (RequestException $e) {
    echo "请求异常: " . $e->getMessage() . "\n";
    if ($e->hasResponse()) {
        echo "错误响应: " . $e->getResponse()->getBody()->getContents() . "\n";
    }
} catch (Exception $e) {
    echo "其他异常: " . $e->getMessage() . "\n";
}
?>
      

***poser 依赖安装

如果使用 Guzzle HTTP 库,需要通过 ***poser 安装:

***poser require guzzlehttp/guzzle

或者在 ***poser.json 中添加依赖:

{
    "require": {
        "guzzlehttp/guzzle": "^7.0"
    }
}
    

C++ 示例代码

使用 libcurl 库


#include <iostream>
 #include <string>
 #include <curl/curl.h>
 #include <json/json.h>

// 回调函数用于接收响应数据
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response) {
    size_t totalSize = size * nmemb;
    response->append((char*)contents, totalSize);
    return totalSize;
}

int main() {
    // API 配置
    const std::string baseUrl = "https://www.stockapi.***.***/v1/base/day";
    const std::string token = "你的token"; // 请替换为实际的token
    
    // 构建完整URL
    std::string url = baseUrl + "?token=" + token + 
                     "&code=600004&startDate=2021-10-10&endDate=2021-10-15&calculationCycle=100";
    
    // 初始化libcurl
    curl_global_init(CURL_GLOBAL_DEFAULT);
    CURL* curl = curl_easy_init();
    
    if (curl) {
        std::string response;
        
        // 设置URL
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        
        // 设置回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        
        // 设置超时
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30L);
        
        // 设置User-Agent
        curl_easy_setopt(curl, CURLOPT_USERAGENT, "CPP-StockAPI-Client/1.0");
        
        // 设置请求头
        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, "A***ept: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        
        // 执行请求
        CURLcode res = curl_easy_perform(curl);
        
        if (res != CURLE_OK) {
             std::cerr << "请求失败: " << curl_easy_strerror(res) << std::endl;
        } else {
            long httpCode;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode);
            
            if (httpCode == 200) {
                std::cout << "请求成功!" << std::endl;
                 std::cout << "响应内容: " << response << std::endl;
                
                // 解析JSON(需要jsoncpp库)
                Json::Value jsonData;
                Json::Reader reader;
                if (reader.parse(response, jsonData)) {
                    std::cout << "JSON解析成功" << std::endl;
                     // 可以进一步处理JSON数据
                     if (jsonData.isMember("data") && jsonData["data"].isArray()) {
                         std::cout << "数据条数: " << jsonData["data"].size() << std::endl;
                    }
                } else {
                    std::cout << "JSON解析失败" << std::endl;
                }
            } else {
                std::cout << "请求失败,状态码: " << httpCode << std::endl;
                 std::cout << "响应内容: " << response << std::endl;
            }
        }
        
        // 清理
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    } else {
        std::cerr << "初始化curl失败" << std::endl;
    }
    
    curl_global_cleanup();
    return 0;
}
      

C# 示例代码

使用 HttpClient(推荐)


using System;
using System.***.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace StockApiDemo
{
    class Program
    {
        private static readonly HttpClient client = new HttpClient();
        
        static async Task Main(string[] args)
        {
            // API 配置
            string baseUrl = "https://www.stockapi.***.***/v1/base/day";
            string token = "你的token"; // 请替换为实际的token
            
            // 构建请求URL
            string requestUrl = $"{baseUrl}?token={token}&code=600004&startDate=2021-10-10&endDate=2021-10-15&calculationCycle=100";
            
            try
            {
                // 设置请求头
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Add("User-Agent", "CSharp-StockAPI-Client/1.0");
                client.DefaultRequestHeaders.Add("A***ept", "application/json");
                
                // 设置超时时间
                client.Timeout = TimeSpan.FromSeconds(30);
                
                Console.WriteLine("正在发送请求...");
                Console.WriteLine($"请求URL: {requestUrl}");
                
                // 发送GET请求
                HttpResponseMessage response = await client.GetAsync(requestUrl);
                
                // 检查响应状态
                if (response.IsSu***essStatusCode)
                {
                    // 读取响应内容
                    string responseContent = await response.Content.ReadAsStringAsync();
                    
                    Console.WriteLine("请求成功!");
                    Console.WriteLine($"状态码: {response.StatusCode}");
                    Console.WriteLine($"响应内容: {responseContent}");
                    
                    // 解析JSON
                    try
                    {
                        JObject jsonResponse = JObject.Parse(responseContent);
                        
                        Console.WriteLine("JSON解析成功");
                        
                        // 检查是否有data字段
                        if (jsonResponse["data"] != null && jsonResponse["data"] is JArray dataArray)
                        {
                            Console.WriteLine($"数据条数: {dataArray.Count}");
                            
                            // 遍历前几条数据
                            int displayCount = Math.Min(3, dataArray.Count);
                            for (int i = 0; i < displayCount; i++)
                            {
                                var item = dataArray[i];
                                Console.WriteLine($"第{i + 1}条数据: {item}");
                            }
                        }
                        
                        // 检查错误信息
                        if (jsonResponse["error"] != null)
                        {
                            Console.WriteLine($"API错误: {jsonResponse["error"]}");
                        }
                    }
                    catch (JsonException ex)
                    {
                        Console.WriteLine($"JSON解析失败: {ex.Message}");
                    }
                }
                else
                {
                    string errorContent = await response.Content.ReadAsStringAsync();
                    Console.WriteLine($"请求失败,状态码: {response.StatusCode}");
                    Console.WriteLine($"错误内容: {errorContent}");
                }
            }
            catch (HttpRequestException ex)
            {
                Console.WriteLine($"网络请求异常: {ex.Message}");
            }
            catch (TaskCanceledException ex)
            {
                Console.WriteLine($"请求超时: {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"发生异常: {ex.Message}");
            }
        }
    }
}
      

Node.js 示例代码

使用 axios 库(推荐)


const axios = require('axios');

// API 配置
const BASE_URL = 'https://www.stockapi.***.***/v1/base/day';
const TOKEN = '你的token'; // 请替换为实际的token

// 请求参数
const params = {
    token: TOKEN,
    code: '600004',
    startDate: '2021-10-10',
    endDate: '2021-10-15',
    calculationCycle: 100
};

async function fetchStockData() {
    try {
        console.log('正在发送请求...');
        console.log('请求URL:', BASE_URL);
        console.log('请求参数:', params);
        
        const response = await axios.get(BASE_URL, {
            params: params,
            timeout: 30000, // 30秒超时
            headers: {
                'User-Agent': 'Node.js-StockAPI-Client/1.0',
                'A***ept': 'application/json'
            }
        });
        
        console.log('请求成功!');
        console.log('状态码:', response.status);
        console.log('响应头:', response.headers);
        
        const data = response.data;
        console.log('响应数据:', JSON.stringify(data, null, 2));
        
        // 处理响应数据
        if (data.data && Array.isArray(data.data)) {
            console.log(`\n数据条数: ${data.data.length}`);
            
            // 显示前3条数据
            const displayCount = Math.min(3, data.data.length);
            for (let i = 0; i < displayCount; i++) {
                console.log(`${i + 1}条数据:`, data.data[i]);
            }
        }
        
        // 检查错误信息
        if (data.error) {
            console.error('API错误:', data.error);
        }
        
        return data;
        
    } catch (error) {
        console.error('请求失败:', error.message);
        
        if (error.response) {
            // 服务器响应了错误状态码
            console.error('错误状态码:', error.response.status);
            console.error('错误响应:', error.response.data);
        } else if (error.request) {
            // 请求已发出但没有收到响应
            console.error('网络错误或超时');
        } else {
            // 其他错误
            console.error('请求配置错误:', error.message);
        }
        
        throw error;
    }
}

// 执行请求
fetchStockData()
    .then(data => {
        console.log('\n数据获取完成');
    })
    .catch(error => {
        console.error('程序执行失败:', error.message);
        process.exit(1);
    });
      

  1. 开发 Tips
    将 token 放入环境变量或配置文件,不要硬编码。
    日期格式严格为 YYYY-MM-DD。
    股票代码为 6 位数字,如 600004。
    设置合理超时(建议 30 s)。
    注意 API 频率限制,做好重试与退避。
    统一使用 UTF-8 编码。
    生产环境务必校验 SSL 证书。
转载请说明出处内容投诉
CSS教程网 » StockAPI量化数据接口对接 Python、Java、PHP、C++、C#、C、NodeJs 请求示例

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买