使用Webwrite执行POST API查询时出现错误的请求

时间:2018-11-07 11:15:59

标签: json matlab api post oauth-2.0

我正在尝试创建一个与api(准确地说是Questrade API)交换信息的应用程序。 api使用oauth2进行安全性和身份验证。

在获取授权令牌,刷新令牌和查询基本信息(我的帐户信息和股票报价)方面,我已经成功 1

但是,当我尝试查询股票期权报价时遇到问题(如here所述)。

我尝试了许多不同的排列,但无济于事。这是我到目前为止所做的:

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 例如,要获取website指示为的帐户信息:

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中。

1 个答案:

答案 0 :(得分:1)

不幸的是,由于您提供的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期望的整数。