user1009073
user1009073

Reputation: 3238

Delphi - REST Request wont work with ClientDataSet on non-Dev boxes

Delphi Seattle...

I have a RestClient, RequestRequest, RestResponse, ResetResponseDataSetAdapter, Datasource, and ClientDataSet all tied together. This configuration works on my development machine, but not on a standard PC. When I delete the RestResponseDataSetAdater, Datasource and ClientDataSet, then the REST call works fine and I can dump the JSON text out to a memo (on all computers), so I know the REST call is working. There is something about those 3 components that works on my development machine, but not a non-development machine.

All 6 components are on a datamodule, called dmREST. It is a test app that only makes this one call, iterates through the Dataset, and writes the values to a TListView. Everything works fine on my development box. The ONLY way I can get it to work on any other computer is to remove the RestResponseDataSetAdater, Datasource and ClientDataSet. Here are the applicable portions of code.

From the button to start the call...The TListView is called UserRequests.

    procedure TForm1.Button1Click(Sender: TObject);
    var
      myCursor: TCursor;
      RequestCount: Integer;
      vNewItem: TListItem;
      baseURL, resource, suffix: String;

    begin
      UserRequests.Clear;

      myCursor      := Screen.Cursor;
      Screen.Cursor := crSQLWait;

      // Call the REST API
      baseURL  := 'https://<removed due to security>/product';
      resource := 'egrapher_request';
      suffix   := '1234';

      if dmREST.restGET(baseURL, resource, suffix) = true then
      begin
        dmREST.ds1.DataSet.First;
        RequestCount := dmREST.ds1.DataSet.RecordCount;

        while not dmREST.ds1.DataSet.Eof do
        begin
          vNewItem         := UserRequests.Items.Add;
          vNewItem.Caption := dmREST.ds1.DataSet.FieldByName('email').AsString;
          vNewItem.SubItems.Add(dmREST.ds1.DataSet.FieldByName('request_date').AsString);
          dmREST.ds1.DataSet.Next;
        end;

      end;

  Screen.Cursor := myCursor;
end;

Within the Datamodule...

function TdmREST.restGET(baseURL, resource, suffix: String) : Boolean;
begin

  dmREST.RESTResponseDataSetAdapter1.FieldDefs.Clear;
  dmREST.RESTRequest1.ResetToDefaults;
  dmREST.RESTResponse1.ResetToDefaults;

  try
    // Now set up the REST Controls...
    dmREST.RESTClient1.baseURL         := baseURL;
    dmREST.RESTRequest1.Method         := TRESTRequestMethod.rmGET;
    dmREST.RESTRequest1.resource       := resource;
    dmREST.RESTRequest1.ResourceSuffix := suffix;

    // Call the REST API to delete the data
    RESTRequest1.Execute;
    Result := True;

  except
    MessageDlg('Unable to connect.  Probably not on VPN network', mtError, [mbOK], 0);
    ShowMessage(IntToStr(RESTResponse1.StatusCode) + ':' + RESTResponse1.StatusText);
    Result := False;
  end;
end;

I have tried this with and without the 'ResetToDefaults' code. Although the Exception fires, it always comes back with 200:OK.

There is something about the parsing of the JSON that is causing the issue, but it is only on the non-development boxes.

Upvotes: 0

Views: 1274

Answers (1)

MartynA
MartynA

Reputation: 30715

From what you say, it sounds as if the machines with the problem either don't have Midas.Dll deployed on them or that it isn't correctly registered in the Registry. Midas.Dll is the Dll that TClientDataSet requires & uses.

If you take a look in DSIntf.Pas, you'll find a procedure CheckDbClient which is called to find the registered location of Midas.Dll on the client. To register Midas.Dll on the client you can use the TRegSvr utility which you'll find in your Delphi bin directory on a dev machine.

As noted by Marc Guillot in a comment, an alternative to deploying + registering Midas.Lib is to add MidasLib to your Uses; this compiles the Midas code into your app.

Upvotes: 3

Related Questions