tushare一直没有出java的sdk,好在出了http协议的api.本项目根据http的api封装而成java
gitee地址
https://gitee.com/ichiva/tushare-sdk.git
项目目录
定义实体类
@Getter @Setter public class TuTable implements Serializable { private String[] fields; private String[][] items; }
定义获取数据的接口
/** * tu 数据 */ public interface TuData { /** * 获取数据 * @return */ Optional<TuTable> get(); }
定义api请求和应答
请求git
@Data public class TuRequest implements Serializable { /** * 接口名 */ private String api; private String token; /** * 输入参数 */ private Map<String,String> params; /** * 输出参数 */ private String[] fields; /** * 输出参数描述 */ private String[] fieldsName; /** * 接口描述 */ private String describe; /** * 简化输入 * @param fieldMap */ public void setFieldMap(Map<String,String> fieldMap) { Set<Map.Entry<String, String>> entries = fieldMap.entrySet(); this.fields = new String[entries.size()]; this.fieldsName = new String[entries.size()]; int i = 0; for (Map.Entry<String, String> entry : entries) { this.fields[i] = entry.getKey(); this.fieldsName[i] = entry.getValue(); i++; } } public Object toQuery(){ HashMap<String, Object> res = new HashMap<>(); res.put("api_name",getApi()); res.put("token",getToken()); res.put("params",getParams()); res.put("fields", Arrays.stream(getFields()).collect(Collectors.joining(","))); return res; } }
应答api
@Data public class TuResponse { private int code; private TuTable data; private String msg; }
抽象的数据读取实现
/** * 读取数据 */ @Slf4j public abstract class AbstractTuData implements TuData { private final TuClient client; private TuRequest request; public AbstractTuData(TuClient client){ this.client = client; } public TuRequest getRequest() { return request; } public void setRequest(TuRequest request) { this.request = request; } @Override public Optional<TuTable> get() { log.info("读取服务器数据 api = {}",request.getApi()); Optional<TuResponse> res = client.post(request); if (res.isPresent()) { TuTable data = res.get().getData(); return Optional.ofNullable(data); } return Optional.empty(); } }
数据缓存缓存
@Slf4j public abstract class TuDataCacheAble extends AbstractTuData { private static DbImpl db; static { try { db = new DbImpl(new Options(), new File(SystemHelper.getTempDir(),"tushare-cache")); } catch (IOException e) { throw new RuntimeException(e); } } public TuDataCacheAble(TuClient client) { super(client); } /** * 取缓存数据 * @return */ @Override public Optional<TuTable> get() { TuRequest request = getRequest(); byte[] key = getCacheKey(request); byte[] bytes = db.get(key); if(bytes != null){ log.info("命中缓存 key = {}",new String(key)); return Optional.of((TuTable)DataUtils.toObject(bytes)); } Optional<TuTable> res = super.get(); res.ifPresent(e -> db.put(key, DataUtils.toByte(e))); return res; } protected byte[] getCacheKey(TuRequest request) { return request.getApi().getBytes(); } /** * 清除全部缓存 */ public void clearAll(){ SeekingIteratorAdapter it = db.iterator(); int n = 0; while (it.hasNext()) { byte[] key = it.next().getKey(); clear(key); n++; } log.info("清理缓存,收影响记录 n = ",n); } /** * 清楚指定缓存 * @param key */ public void clear(byte[] key){ db.delete(key); } }
股票列表获取
api实现类服务器
/** * 股票列表 * * 获取2000年到如今的全部数据 */ public class TuStockBasicData extends TuDataCacheAble { public TuStockBasicData(StringDB db, TuClient client) { super(db, client); TuRequest request = new TuRequest(); request.setApi("stock_basic"); request.setDescribe("获取基础信息数据,包括股票代码、名称、上市日期、退市日期等"); HashMap<String,String> paramsMap = new HashMap<>(); request.setParams(paramsMap); LinkedHashMap<String,String> fieldMap = new LinkedHashMap<>(); fieldMap.put("ts_code","TS代码"); fieldMap.put("symbol","股票代码"); fieldMap.put("name","股票名称"); fieldMap.put("area","所在地域"); fieldMap.put("industry","所属行业"); fieldMap.put("fullname","股票全称"); fieldMap.put("enname","英文全称"); fieldMap.put("market","市场类型 (主板/中小板/创业板/科创板)"); fieldMap.put("exchange","交易所代码"); fieldMap.put("curr_type","交易货币"); request.setFieldMap(fieldMap); setRequest(request); } }
测试
@Slf4j public class TuDailyDataTests { private TuClient clinet; @Before public void Before() throws IOException { //token须要本身取申请,申请地址 this.clinet = new TuClient("http://api.waditu.com/","token"); } @Test public void testTuStockBasicData(){ TuStockBasicData data = new TuStockBasicData(clinet); data.get().ifPresent(System.out::println); } }
测试结果
C:\Users\Chiva\AppData\Local\Temp\tushare-cache [main] INFO cn.ichiva.tushare.sdk.tushare.TuDataCacheAble - 命中缓存 key = stock_basic ts_code symbol name area industry fullname enname market exchange curr_type 000001.SZ 000001 平安银行 深圳 银行 平安银行股份有限公司 Ping An Bank Co., Ltd. 主板 SZSE CNY 000002.SZ 000002 万科A 深圳 全国地产 万科企业股份有限公司 China Vanke Co.,Ltd. 主板 SZSE CNY ...
gitee地址
https://gitee.com/ichiva/tushare-sdk.git
PS:部分暂时用不上的api没有实现,但愿用到的朋友帮助实现ide