Delphi XE Indy 连接到本地服务器 api 但未连接到 public 服务器 api
Delphi XE Indy connects to local server api but not public server api
我在使用 Delphi XE 通过 Indy Client 连接到 public 域 api 时遇到问题。
我可以成功连接到我的本地主机 Web 服务器 api (apache),但是对共享主机上的远程服务器(public 域)的类似尝试会给我一个禁止的 403 错误。
我可以使用 cURL 成功访问同一个 public 域 api。因此,我排除了共享托管服务器上 rights/firewall 的任何问题。
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;
在调用 public api 之前,我需要 set/adjust 使用 TIdHTTP Indy 组件 property/setting 吗?
经过大量研究后,我在 Indy 知识库中找到了解决我的问题的方法。
http://www.indyproject.org/KB/iamgettinga403forbiddene.htm
我更改了我的 indy 组件的 UserAgent 属性 默认值
Mozilla/3.0 (compatible; Indy Library)
而且有效!
我在使用 Delphi XE 通过 Indy Client 连接到 public 域 api 时遇到问题。
我可以成功连接到我的本地主机 Web 服务器 api (apache),但是对共享主机上的远程服务器(public 域)的类似尝试会给我一个禁止的 403 错误。
我可以使用 cURL 成功访问同一个 public 域 api。因此,我排除了共享托管服务器上 rights/firewall 的任何问题。
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;
在调用 public api 之前,我需要 set/adjust 使用 TIdHTTP Indy 组件 property/setting 吗?
经过大量研究后,我在 Indy 知识库中找到了解决我的问题的方法。
http://www.indyproject.org/KB/iamgettinga403forbiddene.htm
我更改了我的 indy 组件的 UserAgent 属性 默认值
Mozilla/3.0 (compatible; Indy Library)
而且有效!