REST错误'套接字错误#10054对等方重置连接'Delphi XE7 vs东京

时间:2018-07-19 15:49:25

标签: json rest delphi delphi-xe7 delphi-10.2-tokyo

我相对较不熟悉使用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;

0 个答案:

没有答案