Неверный запрос при выполнении запроса POST API с использованием webwrite - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь создать приложение, которое обменивается информацией с API (точнее, Questrade API). API использует oauth2 для безопасности и аутентификации.

Мне удалось 1 получить токены авторизации, обновить токены и запросить основную информацию (информацию о моем счете и котировки акций).

Однако при попытке запросить котировки опционов на акции я столкнулся с проблемой (как описано здесь ).

Я пробовал много разных перестановок, но безрезультатно. Это то, что я сделал до сих пор:

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.

1 Ответ

0 голосов
/ 07 ноября 2018

К сожалению, я не могу протестировать решение, поскольку предоставленный вами ключ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...