2016-09-19 4 views
0

У меня возникают проблемы с подключением к общедоступному домену api с Indy Client с использованием Delphi XE.Delphi XE Indy подключается к локальному серверу api, но не к общему серверу api

Я могу успешно подключиться к apache (apache) локального хостинга, но аналогичная попытка удаленного сервера (общедоступного домена) на общедоступном хостинге дает мне запретную ошибку 403.

Я могу получить доступ к тому же общедоступному домену api, используя cURL. Поэтому я исключил все проблемы с правами/брандмауэром на общем сервере хостинга.

function CallService(ServiceID: string;payload:string): string; 
    var 
     JsonToSend: TStringStream; 
     ServerResponse,EndPointURL: string; 
     LastJSONArray: TStringList; 
     MyIndy : TIdHTTP; 
    begin 

    //Local connection WORKS :) 
    EndPointURL := 'http://localhost/api/index.php'; 

    //Remote/Public Domain connection FAILS :(
    EndPointURL := 'http://example.com/api/index.php'; 

    LastJSONArray := TStringList.Create(); 

    LastJSONArray.Values['service_id'] := ServiceID; 
    LastJSONArray.Values['payload'] := payload; 

    JsonToSend := TStringStream.Create(LastJSONArray.Text, TEncoding.UTF8); 

     MyIndy := TIdHTTP.Create; 

     try 

     try 

      MyIndy.Request.Accept := 'application/json'; 
      MyIndy.Request.ContentType := 'application/json'; 
      MyIndy.Request.ContentEncoding := 'utf-8';   

      ServerResponse := MyIndy.Post(EndPointURL, JsonToSend); 

      Result := ServerResponse; 

     except 
      on E: EIdHTTPProtocolException do 
      //status := http.ResponseText; 
      //code := E.ErrorCode; 
      if E.ErrorCode = 401 then ShowMessage('You are not authorised!') 
      else ShowMessage('Poor Connection '+E.Message); 

      on E: Exception do begin 
      //do something else 
      ShowMessage('Poor Connection - B'); 
      end; 

     end; 

     finally 
     MyIndy.Free(); 
     JsonToSend.Free(); 
     LastJSONArray.Free(); 
     end; 

    end; 

Есть ли свойство/установка с компонентом TIdHTTP Инди, что мне нужно установить/настроить перед вызовом общественности апи?

+0

Как выглядит ваш код cURL? 403 означает, что у вас нет доступа к URL-адресу, для этого, вероятно, требуются учетные данные, которые вы не даете 'TIdHTTP'. Вы даете какой-либо cURL? BTW, 'utf-8' не является допустимым значением' Request.ContentEncoding'. Вместо этого вы должны использовать 'Request.Charset', если вообще (вам не нужно указывать кодировку для' application/json'). –

+0

Эй, реми. Я обнаружил, что проблема связана с свойством UserAgent компонента. Кажется, он блокируется хозяином. – davykiash

ответ

1

После нескольких исследований я нашел решение своей проблемы в базе знаний Indy.

http://www.indyproject.org/KB/iamgettinga403forbiddene.htm

Я изменил UserAgent свойство моего компонента из инди по умолчанию

Mozilla/3.0 (совместимый; Indy Library)

и это работает !.