Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/88: Рейтинг темы: голосов - 88, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 32
1

API, REST-запросы, ClientToken

27.09.2018, 07:52. Показов 16126. Ответов 2
Метки api, rest (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пытаюсь освоить API – REST-запросы и JSON-ответы.
Стоит задача работы с девайсом по API.

Есть параметры REST-запроса:
URL: http://<server-name>[:server-port]/api/codes? orderId = { orderId } & param1={ param1 } & param2 = { param2 }
Метод: GET
Тип orderId – UUID
Тип param1 – строка
Тип param2 – целочисленный

JSON-ответ – массив данных JSON Array of Strings

Для отладки пользуюсь утилиткой Curl.

Пример запроса:
curl -X GET -H "clientToken: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" "http://localhost:28999/api/codes?orderId=6f6088f9-f739-41b8-8dfa-5fa795a56cfe& param1 =99999999999999& param2 =2"
Терминалом перехватываю данные, которые поступают в порт:
Код
GET /api/codes?orderId=6f6088f9-f739-41b8-8dfa-5fa795a56cfe& param1=99999999999999& param2=2 HTTP/1.1
Host: localhost:28999
User-Agent: curl/7.55.1
Accept: */*
clientToken: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Реальный сервер отвечает адекватным ответом:
Код
{"globalErrors":["Order not found"],"success":false}
Пытаюсь повторить тот же запрос средствами делфи, проблема возникает с clientToken.

Данные из терминала при отправке запрос средствами делфи:

Код
GET /api/codes?orderId=6f6088f9-f739-41b8-8dfa-5fa795a56cfe&param1=99999999999999&param2=2&clientToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX HTTP/1.1
Connection: Keep-Alive
Accept: */*
Accept-Charset: UTF-8, *;q=0.8
User-Agent: Embarcadero RESTClient/1.0
Host: localhost:28999
Значение clientToken пристраивается за параметрами паровозом. И реальный сервер ругается ошибкой «HTTP/1.1 400 Bad Request» .

В делфи использую:
RESTClient, RESTRequest, RESTResponse, OAuth2Authenticator.
Скриншоты ниже.

Помогите, пожалуйста, с clientToken.
Это мое первое знакомство с API, много я еще не знаю, может быть что-то упускаю из виду.
Миниатюры
API, REST-запросы, ClientToken   API, REST-запросы, ClientToken   API, REST-запросы, ClientToken  

API, REST-запросы, ClientToken  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2018, 07:52
Ответы с готовыми решениями:

REST запросы, обработка ошибок
Здравствуйте. Использую компоненты RESTRequest и RESTResponse. Отправляю запросы, получаю ответы...

REST API в Delphi
Доброго времени суток. Столкнулся с такой проблемой как работа с REST API. Сколько бы мануалов не...

1C и REST API
День добрый. Может ли 1С отвечать на запросы REST API инициируемые сторонним приложением? Если...

Rest api
обьясните рууским языком, что такое REst Api,Api?

2
101 / 97 / 23
Регистрация: 11.01.2012
Сообщений: 868
27.09.2018, 09:12 2
Лучший ответ Сообщение было отмечено Fox78 как решение

Решение

Может добавить заголовок вручную:
Delphi
1
RESTClient1.SetHTTPHeader('clientToken','XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX');
И UserAgent бы поменять тоже.
1
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 32
28.09.2018, 02:03  [ТС] 3
Zergius, не помогло, но подтолкнуло в нужном направлении, спасибо! =)
Ниже рабочий код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
unit API;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IPPeerClient, Vcl.StdCtrls, REST.Client,
  Data.Bind.Components, Data.Bind.ObjectScope, REST.Authenticator.OAuth,
  FireDAC.Stan.StorageJSON, REST.Types, System.JSON, System.Net.URLClient;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    RESTClient1: TRESTClient;
    RESTRequest1: TRESTRequest;
    RESTResponse1: TRESTResponse;
    procedure Button1Click(Sender: TObject);
    procedure RESTRequest1HTTPProtocolError(Sender: TCustomRESTRequest);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
RESTClient1.Accept:='*/*';
RESTClient1.AcceptCharset:='UTF-8, *;q=0.8';
RESTClient1.BaseURL:='http://localhost:28999';
RESTClient1.UserAgent:='agent';
 
RESTRequest1.Accept:='*/*';
RESTRequest1.AcceptCharset:='UTF-8, *;q=0.8';
RESTRequest1.Method:=rmGET;
RESTRequest1.Resource:='api/codes';
RESTRequest1.Timeout:=30000;
 
RESTRequest1.Params.Clear;
RESTRequest1.Params.Add;
RESTRequest1.Params[0].Kind:=TRESTRequestParameterKind.pkHTTPHEADER;
RESTRequest1.Params[0].name:='clientToken';
RESTRequest1.Params[0].Options:=[poDoNotEncode];
RESTRequest1.Params[0].Value:='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
 
RESTRequest1.Params.Add;
RESTRequest1.Params[1].name:='orderId';
RESTRequest1.Params[1].Value:='6f6088f9-f739-41b8-8dfa-5fa795a56cfe';
 
RESTRequest1.Params.Add;
RESTRequest1.Params[2].name:='param1';
RESTRequest1.Params[2].Value:='99999999999999';
 
RESTRequest1.Params.Add;
RESTRequest1.Params[3].name:='param2';
RESTRequest1.Params[3].Value:='2';
 
RESTRequest1.Execute;
ShowMessage(RESTResponse1.Content);
end;
 
end.
Запрос перехваченный терминалом (ClientToken там, где нужно):
Код
GET /api/codes?orderId=6f6088f9-f739-41b8-8dfa-5fa795a56cfe&param1=99999999999999&param2=2 HTTP/1.1
Connection: Keep-Alive
Accept: */*
Accept-Charset: UTF-8, *;q=0.8
User-Agent: agent
clientToken: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Host: localhost:28999
0
28.09.2018, 02:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2018, 02:03
Помогаю со студенческими работами здесь

Как последовательно обрабатывать запросы REST
Подскажите, пожалуйста, как последовательно обрабатывать запросы Например, 2 пользователя...

Rest API, POST
Порылся в гугле, но чот не нашел сабжа с примерами. Как мне, например, отправить post - запрос на...

Yandex REST API
Здравствуйте! Разбираюсь с Yandex REST API. Я смог разобраться, как работать через get-запросы,...

REST api Dropbox
Успешно получаю токен доступа, но никак не могу составить правильно запрос Последняя попытка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru