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);
});
- 开发 Tips
将 token 放入环境变量或配置文件,不要硬编码。
日期格式严格为 YYYY-MM-DD。
股票代码为 6 位数字,如 600004。
设置合理超时(建议 30 s)。
注意 API 频率限制,做好重试与退避。
统一使用 UTF-8 编码。
生产环境务必校验 SSL 证书。