Delphi - REST请求在非开发框

时间:2017-10-13 20:55:53

标签: json rest delphi

德尔福西雅图......

我将RestClient,RequestRequest,RestResponse,ResetResponseDataSetAdapter,Datasource和ClientDataSet全部捆绑在一起。此配置适用于我的开发机器,但不适用于标准PC。当我删除RestResponseDataSetAdater,Datasource和ClientDataSet时,REST调用工作正常,我可以将JSON文本转储到备忘录(在所有计算机上),所以我知道REST调用正在运行。这3个组件可以在我的开发机器上运行,但不是非开发机器。

所有6个组件都在数据模块上,称为dmREST。它是一个测试应用程序,只进行一次调用,遍历数据集,并将值写入TListView。在我的开发盒上一切正常。我可以让它在任何其他计算机上工作的唯一方法是删除RestResponseDataSetAdater,Datasource和ClientDataSet。以下是代码的适用部分。

从按钮开始调用... TListView称为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;

在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;

我在使用和不使用'ResetToDefaults'代码时尝试了这个。虽然Exception会触发,但它总是以200:OK回复。

解决导致问题的JSON有一些问题,但它只在非开发框上。

1 个答案:

答案 0 :(得分:3)

根据您的说法,听起来好像有问题的计算机上没有部署Midas.Dll,或者没有在注册表中正确注册。 Midas.Dll是TClientDataSet需要的Dll&amp;使用

如果您查看DSIntf.Pas,您将找到一个程序CheckDbClient,该程序被调用以在客户端上查找Midas.Dll的注册位置。要在客户端注册Midas.Dll,您可以使用您可以在开发机器上的Delphi bin目录中找到的TRegSvr实用程序。

正如Marc Guillot在评论中指出的那样,部署+注册Midas.Lib的替代方法是将MidasLib添加到您的用途中;这会将Midas代码编译到您的应用程序中。