Перейти к содержанию
Fire Monkey от А до Я
  • 0

[SSL] Как получить содержимое страницы по HTTPS с помощью INDY?


rareMax

Вопрос

Плоховато знаю особенности интернет протоколов. Необходимо с помощью TidHTTP открыть следующий URL:

https://oauth.vk.com/authorize?client_id=491792444&scope=offline&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&v=5.28&response_type=token

Вылетает ошибка:

 

 

Цитата

 

First chance exception at $75013E28. Exception class EIdHTTPProtocolException with message 'HTTP/1.1 401 Unauthorized'. Process Project4.exe (7344)

Код, с помощью которого подключаюсь:

unit vkAPI.Core.Requests;

interface

uses
  System.Classes;

Type
  TRequestMng = Class(TComponent)
  Private Const
    VK_MIN_INTERVAL = 1000 / 3 + 1;

    (*
      Параметры могут передаваться как методом GET, так и POST. Если вы будете
      передавать большие данные (больше 2 килобайт), то следует использовать метод POST.
    *)
    VK_MAX_GET_LENTHG = 2000;

  private
    fisSSL: Boolean;
    fLastAPIusage: TDateTime;

  protected
    function BetwenMS(Now, Old: TDateTime): integer;
  public
    constructor Create(AOwner: TComponent); override;
    Function Get(Const URL: String): String;
  published
    property IsSSL: Boolean read fisSSL write fisSSL default False;
  End;

implementation

uses
  vkAPI.Core.Utils,
  idHTTP,
  IdSSLOpenSSL,
  System.SysUtils;

{ TRequestMng }

function TRequestMng.BetwenMS(Now, Old: TDateTime): integer;
begin
  Result := Round((Now - Old) * 24 * 60 * 60 * 1000);
end;

constructor TRequestMng.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fisSSL := False;

end;

function TRequestMng.Get(const URL: String): String;
var
  fHTTP: TIdHTTP;
  fSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  fHTTP := TIdHTTP.Create;
  // if IsSSL then
  begin
    fSSL := TIdSSLIOHandlerSocketOpenSSL.Create(fHTTP);
    fHTTP.IOHandler := fSSL;
    fHTTP.AllowCookies := True;
    fHTTP.HandleRedirects := True;
  end;
  try
    if URL.Length > VK_MAX_GET_LENTHG then
      raise Exception.Create
        ('Если вы будете передавать большие данные (больше 2 килобайт), то следует использовать метод POST. ');

    if BetwenMS(Now, fLastAPIusage) < VK_MIN_INTERVAL then
    begin
      Sleep(BetwenMS(Now, fLastAPIusage));
    end;
    Result := fHTTP.Get(URL);
    fLastAPIusage := Now;
  finally
    // if IsSSL then
    FreeAndNil(fSSL);
    FreeAndNil(fHTTP);
  end;
end;

end. 

Код программы:

program Project4;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  vkAPI.Core.Requests in 'vkApi\vkAPI.Core.Requests.pas';

Var
  VK: vkAPI.Core.Requests.TRequestMng;

begin
  VK := TRequestMng.Create(nil);
  try
    { TODO -oUser -cConsole Main : Insert code here }
    (VK.Get('https://oauth.vk.com/authorize?client_id=491792444&scope=offline' +
      '&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&' +
      'v=5.28&response_type=token'));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  VK.Free;

end.
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Не работал с ВК.API, но судя по ответу - ваше приложение не считается авторизованным, и Indy с https тут ни при чем, т.к. 401 - ответ, полученный от сервера vk.com

Ссылка на комментарий
  • 0
  • Модераторы
begin
  fSSL := TIdSSLIOHandlerSocketOpenSSL.Create(fHTTP);
  fHTTP.IOHandler := fSSL;
  fHTTP.AllowCookies := True;
  fHTTP.HandleRedirects := True;
end;

Указать НУЖНЫЙ тип SSL/TLS и его версию

и если это Windows программа, то надеюсь вы не забыли библиотеки ssl положить вместе с исполнительным файлом

{"error":"invalid_request","error_description":"application was deleted"}

ответ на запрос, проверьте id вашего приложения

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

Насчет типа ссл спасибо, буду с пк проверю. Библиотеки лежат в папке, иначе бы другая ошибка была. Ид приложения специально поставлен неправильно. Ну а в целом спасибо за варианты моих ошибок

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...