我正在尝试创建一个与api(确切地说是Questrade api(交换信息的应用程序。api使用oauth2进行安全和身份验证。
我在获取授权令牌、刷新令牌和查询基本信息(我的账户信息和股票报价(方面取得了成功。
然而,当我试图查询股票期权报价时,我遇到了一个问题(如本文所述(。
我试过许多不同的排列,但都没有用。这就是我迄今为止所做的:
1(我已经采用了上面链接中提供的"示例请求"部分中所示的示例,并执行了jsondecode
以获得MATLAB等价物和参数结构必须编码的"精确模板":
>> eg_param = jsondecode('{"filters":{"optionType":"Call","underlyingId":27426,"expiryDate":"2017-01-20T00:00:00.000000-05:00","minstrikePrice":70,"maxstrikePrice":80},"optionIds":[9907637, 9907638]}')
eg_param =
struct with fields:
filters: [1×1 struct]
optionIds: [2×1 double]
>> eg_param.filters
ans =
struct with fields:
optionType: 'Call'
underlyingId: 27426
expiryDate: '2017-01-20T00:00:00.000000-05:00'
minstrikePrice: 70
maxstrikePrice: 80
>> eg_param.optionIds
ans =
9907637
9907638
2(将我的实际值(real_params
(替换为示例中的值:
real_params.optionIds = 23255262;
real_params.filters.optionType = 'Call';
real_params.filters.expiryDate ='2018-11-09T00:00:00.000000-05:00';
real_params.filters.underlyingId = 40825;
real_params.filters.minstrikePrice = [];
real_params.filters.maxstrikePrice = [];
3(已将weboptions
'RequestMethod
参数更改为post
web_opt.RequestMethod = 'Post';
4(使用webwrite
函数,而不是"webread"来发布和查询服务器:
new_data = webwrite(['https://api01.iq.questrade.com/',...
'v1/markets/quotes/options'], real_params, web_opt);
然而,当我这样做时,会得到错误消息:
*The server returned the status 400 with
message "Bad Request" in response to the
request to URL
https://api01.iq.questrade.com/v1/markets/quotes/options.*
我尝试了许多不同的排列,包括更改方括号、[]、{}、{{}},以及为参数使用不同的值,但结果是相同的。此外,每当我进行测试时,我都会确保刷新访问令牌,并使用"帐户信息"请求测试连接是否正常,因此此错误与任何授权、安全或连接问题无关。
1例如,获取账户信息,网站指示为:
GET https://api01.iq.questrade.com/v1/accounts
我有1(。使用MATLAB的weboptions
并创建一个对象以在HeaderFields
:中存储令牌信息
web_opt = weboptions;
web_opt.RequestMethod = 'Get';
headerFields = {'Authorization', ['Bearer ', 'ZHHgMgh0up5UqJ9TSOIALpkoVpi0']};
web_opt.HeaderFields = headerFields;
2(。使用查询服务器
data = webread(['https://api01.iq.questrade.com/', 'v1/accounts'], web_opt);
并实现了与API服务器的通信,MATLAB将我的账户信息作为结构数组存储在变量data
中。
很遗憾,我无法测试解决方案,因为您提供的API密钥似乎不起作用,但它可能无论如何都会对您有所帮助。
您能发现使用这两个块生成的JSON之间的区别吗?
% Original code:
real_params.optionIds = 23255262;
real_params.filters.optionType = 'Call';
real_params.filters.expiryDate ='2018-11-09T00:00:00.000000-05:00';
real_params.filters.underlyingId = 40825;
real_params.filters.minstrikePrice = [];
real_params.filters.maxstrikePrice = [];
%{
>> jsonencode(real_params)
ans =
'{"optionIds":2.3255262E+7,"filters":{"optionType":"Call","expiryDate":"2018-11-09T00:00:00.000000-05:00","underlyingId":40825,"minstrikePrice":[],"maxstrikePrice":[]}}'
%}
% Slightly modified code:
real_params = struct();
real_params.optionIds = int32(23255262);
real_params.filters.optionType = 'Call';
real_params.filters.expiryDate ='2018-11-09T00:00:00.000000-05:00';
real_params.filters.underlyingId = 40825;
real_params.filters.minstrikePrice = [];
real_params.filters.maxstrikePrice = [];
%{
>> jsonencode(real_params)
ans =
'{"optionIds":23255262,"filters":{"optionType":"Call","expiryDate":"2018-11-09T00:00:00.000000-05:00","underlyingId":40825,"minstrikePrice":[],"maxstrikePrice":[]}}'
%}
在这种情况下,自动转换可能是罪魁祸首(由于缺乏更好的理由,将optionIds
作为double
值发送,而不是API期望的整数