Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / HTTP 400 неверный запрос / 11 сообщений из 11, страница 1 из 1
05.05.2021, 21:21
    #40068667
BESO1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
Доброго дня.
Авторизация через Postman передаётся параметры Headers хешированы SHA512 UserName+SecretKey+Password+date и на вкладке Body UserName и Password формате JSON

1) Делаю хеширования SHA512 через Delphi

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
uses System.Hash,
......................
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
begin
   UserName := 'MyLogin';
   SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
   Password := 'MyPass';
   mydate := FormatDateTime('dd.mm.yyyy',now());
   Fullparam := UserName+SecretKey+Password+mydate;
   Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
   // для проверки получаю в  Memo1 и это проверял Postman-е
   Memo1.Text := Hash;
end;


Это хешированы код я проверяю Postman-е и всё нормально - правильно работает. Проблема возникает при передача параметров для авторизаций. Питаюсь передать так
Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
  const URL = 'http://testapi.screeninghub.ge/api/Authorize/SignIn';
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
  MyParams :  TStringList;
  RequestBody: ISuperObject;

begin
    try
    // ---TStringList Создать
    MyParams:= TStringList.Create;
    //--------------
    NetHTTPClient1.Create(nil);
 //------------------------------------------
     UserName := 'MyLogin';
     SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
     Password := 'MyPass';
     mydate := FormatDateTime('dd.mm.yyyy',now());
     Fullparam := UserName+SecretKey+Password+mydate;
 //--------------------------------
   //--------HandleRedirects := true; ----------------------
   IdHTTP1.HandleRedirects := true;
   // -----------------------
   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
 //--------------------------------
     Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
 //-------------------------------------
     MyParams.Add('Hash='+Hash+'');
     MyParams.Add('userName=MyLogin');
     MyParams.Add('password=MyPass');

 //------------------------------------------------------------------------
  idHTTP1.Request.ContentType := 'application/json';
  idHTTP1.Request.ContentEncoding := 'utf-8';
  Idhttp1.Request.Accept := 'application/json';
//  Idhttp1.Request.AcceptEncoding :='raw';
 //-----------------------------------------------------------
    Memo1.Text := IdHTTP1.Post(URL, MyParams);
//  Memo1.Text := Hash;
    finally
         MyParams.Free;
    end;
end;


Получаю ошибка HTTP 400 Bad Request я передаю MyParams всё ... Ребята, из за чего это может быть ? где я допускаю ошибку ?
...
Рейтинг: 0 / 0
05.05.2021, 21:22
    #40068668
BESO1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
Параметр Body
...
Рейтинг: 0 / 0
05.05.2021, 21:52
    #40068672
vkorshun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
BESO1212, Мне кажется в вашем запросе не передается JSON. По идее MyParams должен быть не TStringList а типа TStringStream.Create('{"userName":"...","password":"...","hash":"..."}')
...
Рейтинг: 0 / 0
05.05.2021, 22:00
    #40068673
vkorshun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
BESO1212, И судя по скринам с проверкой. Json должен содержать только userName и password а hash передается в header. И еще вопрос, правильно ли Вы hash формируете ?
...
Рейтинг: 0 / 0
05.05.2021, 22:14
    #40068676
BESO1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
vkorshun Спасибо за внимание .
Смотрите у меня Hash да правильно хешированы , я его проверял в Postman-е .
Вопрос: то что есть в Postman-е Headers - это не JSON да ? а то что есть на Body это JSON , и все равно параметры из Headers и из Body надо передать как JSON ?
...
Рейтинг: 0 / 0
06.05.2021, 00:07
    #40068684
BESO1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
Так тоже самое ошибка
Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
  const URL = 'http://testapi.screeninghub.ge/api/Authorize/SignIn';
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
  JSON :  TStringStream;
  Headers : TStringList;

begin
    try
 //------------------------------------------
     UserName := 'MyLogin';
     SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
     Password := 'MyPass';
     mydate := FormatDateTime('dd.mm.yyyy',now());
     Fullparam := UserName+SecretKey+Password+mydate;
 //--------------------------------
   //--------HandleRedirects := true; ----------------------
   IdHTTP1.HandleRedirects := true;
   // -----------Только это для SSL -------------
   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
 //--------------------------------
     Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
 //-------------------------------------
    Headers := TStringList.Create;
    Headers.Add('Hash='+Hash+'');
    // ---TStringList Создать
    JSON:= TStringStream.Create('{"userName": "MyLogin",  '+
                                ' "password": "MyPass"  '+
                                '}');

 //------------------------------------------------------------------------

  idHTTP1.Request.ContentType := 'application/json';
  idHTTP1.Request.ContentEncoding := 'utf-8';
  Idhttp1.Request.Accept := 'application/json';
 //---------------Передаю Headers и JSON--------------------------------------------
     idHTTP1.Post(URL, Headers, JSON);
//  ------------------------
    finally
         Headers.Free;
         JSON.Free;
    end;
end;

end.
...
Рейтинг: 0 / 0
06.05.2021, 06:16
    #40068694
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
BESO1212,

Надо смотреть сниффером, что уходит с PostMan'a и с вашей программы.
С вашей программы скорее всего будет в BODY JSON'е каша. Например, перевод строки может быть заменён на "&" или на "%"
...
Рейтинг: 0 / 0
06.05.2021, 10:44
    #40068711
vkorshun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
BESO1212,
Headers.Add('Hash='+Hash+''); Мне кажется так не верно. Посмотрите как правильно заполнять header
...
Рейтинг: 0 / 0
06.05.2021, 10:57
    #40068715
vkorshun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
BESO1212,
Например
Код: pascal
1.
IdHTTP1.Request.CustomHeaders.AddValue('Hash',hash);


И еще одна строка меня смущает
Код: pascal
1.
IdHTTP1.IOHandler :=IdSSLIOHandlerSocketOpenSSL1

. Я не помню как там в Indy надо, но уже по идее даже TLS1 deprecated. И Ваш запрос работает по htpp , не по https.
...
Рейтинг: 0 / 0
06.05.2021, 11:32
    #40068722
vkorshun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
BESO1212, Я вижу по коду что у Вас есть возможность использовать NetHTTPClient. Почему его не используете?
Примерно так
Код: pascal
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.
    FHttpClient: TNetHTTPClient;
    FHttpRequest: TNetHTTPRequest;
    FLastResponse: IHTTPResponse;


  FHttpClient := TNetHTTPClient.create(AOwner);
  FHttpRequest := TNetHTTPRequest.create(AOwner);
  FHttpRequest.Client := FHttpClient;

function TEReceiptAssistent.doRequest( hesh, data: String): String;
var
  sourceStream: TStringStream;
  respStream: TMemoryStream;
begin
  sourceStream := nil;
  respStream := TMemoryStream.create;
  FHttpRequest.CustomHeaders['Hash'] := hash;
  FHttpRequest.ContentStream := respStream;
  FHttpRequest.MethodString := 'post';
  FHttpRequest.URL := 'http://testapi.screeninghub.ge/api/Authorize/SignIn';
  FHttpClient.ContentType := 'application/json';
  FHttpClient.AcceptEncoding := 'UTF-8';

  if not data.IsEmpty then
  begin
    sourceStream := TStringStream.create;
    sourceStream.WriteString(data);
    sourceStream.Position := 0;
    FHttpRequest.sourceStream := sourceStream;
  end;
  try
    FLastResponse := FHttpRequest.execute();
    Result := FLastResponse.ContentAsString(TEncoding.UTF8);
    if (FLastResponse.StatusCode <> 200) then
    begin
      if Result.Contains(':"ERROR"') then
      begin
        var
        resp := SO(Result);
        if resp.S['result'] = 'ERROR' then
          raise Exception.create(resp.O['content'].S
            ['errorMessage']);
      end
      else
        raise Exception.create(FLastResponse.StatusText + ' ' +
          IntToStr(FLastResponse.StatusCode) + ' ' + Result);
    end;

  finally
    respStream.Free;
    FreeAndNil(sourceStream);
    FHttpRequest.ContentStream := nil;
    FHttpRequest.sourceStream := nil;

  end;
end;

TUserAuth = record
   userName: String;
   password: String;
end;

userInfo: TUserAuth;

// Вызов
   doRequest(hesh, TJSON.stringify(userAuth));
...
Рейтинг: 0 / 0
06.05.2021, 15:32
    #40068776
BESO1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HTTP 400 неверный запрос
Ребята всем огромное спасибо .! Реализовал так через NetHTTPClient1 работает всё нормально.

Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
  Const MyURL =  'http://testapi.screeninghub.ge/api/Authorize/SignIn';
var
  UserName,  SecretKey, Password: string;
  mydate : string;
  Fullparam : string;
  Hash : string;
  JSON :  TStringStream;
begin
 //----------------------------------------
     UserName := 'MyLogin';
     SecretKey := 'jghhjgghjhkhjkhhhhjkjhk';
     Password := 'MyPass';
     mydate := FormatDateTime('dd.mm.yyyy',now());
     // Обединить таком порядке как на документацие
     Fullparam := UserName+SecretKey+Password+mydate;
 //-------------хешироват SHA512 UserName+SecretKey+Password+mydate ---------------------------
 Hash := THashSHA2.GetHashString(Fullparam, THashSHA2.TSHA2Version.SHA512).ToUpper;
 //-----------передаю Headers = hash -----------------------------
  NetHTTPClient1.CustomHeaders['Hash'] := hash;
 //-----------------------------------------
  NetHTTPClient1.ContentType := 'application/json';
  NetHTTPClient1.AcceptEncoding := 'UTF-8';
//-----------------Body JSON ------------------------
     JSON:= TStringStream.Create('{"userName": "MyLogin",  '+
                                 ' "password": "MyPass"  '+
                                 '}');
  //----------------передаю URL + только JSON .! ----------------------
 Memo1.Lines.Text := NetHTTPClient1.Post(MyURL,  JSON).ContentAsString();
end;
end.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / HTTP 400 неверный запрос / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]