Delphi client for RemObjects SDK SOAP server

Hi,

I am trying to make RemObjects SDK SOAP server (in Delphi) and import WSDL in Delphi client following Wiki below
http://wiki.remobjects.com/wiki/WIP:How_to_consume_RemObjects_SOAP_services_with_third_party_clients

Could you please provide me some guidance how to handle properly ClientID headers ?

I see in proxy file generated by Delphi WSDL importer lines like

InvRegistry.RegisterHeaderClass(TypeInfo(CustomerUtils), ROClientIDHeader, ‘ROClientID’, ‘http://tempuri.org/’);

but do not know how to read/write this header values.

Thanks

On client-side, you need to create

<ROClientIDHeader SOAP-ENV:mustUnderstand="0" xmlns="http://tempuri.org/">
  <ID>your_guid</ID>
</ROClientIDHeader>

in header node manually.

On server-side, you need to set xsoClientIdInWsdl in TROSOAPMessage.SerializationOptions.
later you can read it in any service’s method as ClientID.

Hi EnugenyK,

I know this. I am looking for best practice example how to do this with Delphi (WSDL importer)

Your wiki http://wiki.remobjects.com/wiki/WIP:How_to_consume_RemObjects_SOAP_services_with_third_party_clients does have sample for .Net but for some reason Delphi example is missing.

You need to cast your service to ISOAPHeaders and in that interface set ROClientID:

var
  login_params: LoginService___Login;
  login_response: LoginService___LoginResponse;
  login: LoginService;
  login_headers, data_headers: ISOAPHeaders;
  lROClientIDHeaders: ROClientIDHeader;
  data: DataService;
  data_parameters: DataService___GetDateTime;
  data_response: DataService___GetDateTimeResponse;
begin
  lROClientIDHeaders := ROClientIDHeader.Create;
  try
    lROClientIDHeaders.ID := GUIDToString(NewGuid);  //generate new guid
    login := GetLoginService;
    login_params := LoginService___Login.Create;
    try
      if Supports(login,ISOAPHeaders,login_headers) then try
         login_headers.Send(lROClientIDHeaders);  //set ROClientIDHeader for login service
      finally
         login_headers := nil;
      end;

      login_params.aUserID:= 'a';
      login_params.aPassword:='a';
      login_response := login.Login(login_params);
      ShowMessage('Logged = '+ BoolToStr( login_response.Result,true));
      if not login_response.Result then exit;
    finally
      login_response.Free;
      login_params.Free;
      login := nil;
    end;

    data := GetDataService();
    data_parameters:= DataService___GetDateTime.Create;
    try
      if Supports(data,ISOAPHeaders,data_headers) then try
        data_headers.Send(lROClientIDHeaders);  //set ROClientIDHeader for data service
      finally
        data_headers := nil;
      end;

      data_response := data.GetDateTime(data_parameters);
      ShowMessage(DateTimeToStr(data_response.Result.AsDateTime));
      data_response.Free;
    finally
      data_parameters.Free;
      data := nil;
    end;
  finally
    lROClientIDHeaders.Free;
  end;
end;