我相对较不熟悉使用Delphi RAD Studio固有的REST组件,并且我正尝试与运行REST / JSON应用程序的交付公司进行接口以调度交付驱动程序。
我已经成功地发送了我的登录信息,并获得了client_id和access_token作为获取和发出传递请求的授权。
为了完成此任务,我使用了TRESTClient,TRESTRequest和TRESTResponse组件。与我联系的公司有一个“测试和生产”应用程序。对其系统的登录API调用相对简单。
最初开发接口时,从他们的“实时”系统获取登录信息时遇到了问题,因为在发出登录请求时,我始终收到错误“套接字错误#10054对等连接重置”。连接到他们的演示系统时,我没有收到错误消息。
对我来说,这清楚地表明了这两个系统之间的某种区别。他们可以通过在最后进行“服务器交换”来解决此问题。不知道这意味着什么,但显然涉及很多。他们的解释是:
'我们在基于AWS的服务器上确定不允许连接。然后,我们将服务器从AWS移到BizSpark。'
这似乎可以解决问题。这个周末,同样的问题又回来了,他们声称最后没有改变,我也知道没有改变。
背景非常重要。现在是我真正的问题。
在解决此问题的过程中,我编写了一些测试应用程序。一种在Delphi XE7中使用,另一种在Tokyo 10.2.3中使用。这些应用程序只发出一个简单的登录请求。
登录URL的格式为: https://live.CompanyName.io/token
,并且需要以下格式的数据参数:
grant_type = password&username = UsernameParam&password = PasswordParam
我仅在使用Delphi XE7应用程序向其实时系统发出登录请求时收到此错误。在Tokyo 10.2.3中使用完全相同的代码即可正常工作。
因此,看来尽管供应商测试与实时数据库或配置之间存在某种差异,但Tokyo 10.2.3 REST组件似乎能够弥补这一不足。这使我相信,在Delphi XE7中配置REST组件时可能会丢失一些东西。
我动态地配置了组件,并且XE7和Tokyo的代码相同。
在组件的配置中是否缺少某些内容? 我已经附上我的代码。
我发出登录REST请求时发生错误。
当我使用Telerik Fiddler发出API调用时,演示和实时数据库调用均成功。这再次表明我在Delphi XE7 REST组件的配置中可能缺少的东西。
我正在运行Delphi XE7,Tokyo 10.2.3和Windows 10 64位。
非常感谢您的帮助。
伦纳德
procedure TfrmMain.RESTGetAuthorization(IntegrationPartnersID: integer);
var RESTClient: TRESTClient;
RESTRequest: TRESTRequest;
RESTResponse: TRESTResponse;
RESTLoginURL, RESTUserName, RESTPassword: string;
LoginStr, ParamStr: string;
JsonObject: TJSONObject;
JsonPair: TJSONPair;
begin
if IntegrationPartnersID = 0 then
begin
RESTLoginURL := testURL.Text;
RESTUserName := testUsername.Text;
RESTPassword := testPassword.Text;
end
else
begin
RESTLoginURL := liveURL.Text;
RESTUserName := liveUsername.Text;
RESTPassword := livePassword.Text;
end;
LoginStr := RESTLoginURL+'/token';
ParamStr := 'grant_type=password&username='+RESTUserName+'&password='+RESTPassword;
RESTClient := TRESTClient.Create(LoginStr);
RESTRequest := TRestRequest.Create(nil);
RESTResponse := TRESTResponse.Create(nil);
try
RESTRequest.Client := RESTClient;
RESTRequest.method := rmPUT;
RESTRequest.Response := RESTResponse;
RESTRequest.AddParameter('body', ParamStr, TRESTRequestParameterKind.pkGETorPOST);
RESTRequest.Params.ParameterByName('body').ContentType := ctAPPLICATION_JSON;
memRequest.lines.add(ParamStr);
try
RESTRequest.Execute; <- ERROR OCCURS HERE
except on E:Exception do
begin
memRequest.Lines.Add('Connection Failed! - Error: ' + e.Message);
end;
end;
if RESTResponse.StatusCode <> 200 then //Success
begin
memRequest.Lines.Add('Connection Failed! - Status: ' + IntToStr(RESTResponse.StatusCode) + ':' + RESTResponse.StatusText);
end
else
begin
memResponse.Lines.Add(RESTResponse.JSONtext);
JsonObject :=JSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(RESTResponse.Content),0) as TJSONObject;
try
try
JsonPair := JsonObject.Get('userId');
if JsonPair <> nil then
begin
memRequest.Lines.Add('Connection Successful: - ClientID: ' +(JsonPair.JsonValue as TJSONValue).Value);
end
else
memRequest.Lines.Add('Connection Failed! - ClientID Not Found');
JsonPair := JsonObject.Get('access_token');
if JsonPair <> nil then
begin
ThisAccessToken := (JsonPair.JsonValue as TJSONValue).Value;
memRequest.Lines.Add('Connection Successful: - Access Token: ' +(JsonPair.JsonValue as TJSONValue).Value);
end
else
memRequest.Lines.Add('Connection Failed! - Access Token Not Found');
except on E:Exception do
begin
memRequest.Lines.Add('Connection Failed! - Error: ' + e.Message);
end;
end;
finally
JsonObject.Free;
end;
end;
finally
RESTResponse.Free;
RESTRequest.Free;
RESTClient.Free;
end;
end;