Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: foutmeldingen met objecten, die ik niet begrijp

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    foutmeldingen met objecten, die ik niet begrijp

    Mischien een rare titel, maar kon even niets anders verzinnen.

    Met XE7 heb ik inmiddels een WSDL kunnen importeren, zodat delphi daar een mooie unit voor kan maken. Prima. Nu dacht ik dat alles simpel was en gewoon wat functies oproepen en het antwoord verwerken. Niet dus. Ik zoek dus wat hulp.

    Wat ik nu probeer is een functie aan te roepen, die een validatie doet of de gebruiker echt bestaat.
    Dit is wat ik heb (uitgevogeld via de WSDL unit):
    Delphi Code:
    1. procedure TFrmConnectietest.BtnTestConnectionClick(Sender: TObject);
    2. var SOAPkre : KREPortType;
    3.     Request :  ValidateListRequest;
    4.     Response : ValidateListResponse;
    5.     Header   : KRHeaderType;
    6. begin
    7.     Header.Username.Text := 'ws_nelisbloembol';
    8.     Header.Password.Text := '********';
    9.     Header.Checksum.Text := '**************************';
    10.     Header.ExporterParty.PrimaryID.schemeID := '34054275';
    11.     Request.Header := Header;
    12.     SOAPkre := GetKREPortType(True,'GetValidateList',HTTPRIO1);
    13.     Response := SOAPkre.GetValidateList(Request);
    14. end;
    Dit geeft deze foutmelding op de eerste 'header' regel tot gevolg (uiteraard bevatten de * een waarde die gevraagd wordt).

    Project xxxx raised exception class $C0000005 with message 'access violation at 0x0040ae7e: write of address 0x0000000c'.

    Dit geeft aan dat een object niet is aangemaakt. Nomaal zou ik hier Header := KRHeaderType.create; uitvoeren, maar dat geeft hetzelfde resultaat.
    All die objecten zijn geërfd van de class TRemotable.

    Ik weet niet of ik de WSDL hier mag neerzetten m.b.t. de veiligheid van de gegevens.
    Delphi is great. Lazarus is more powerfull

  2. #2
    Moet je in die soap van jou niet een request invullen?

    Wat is het type van je request in je SOAP unit? Meestal moet je die eerst creeeren en dan vullen met iets. Dat komt van te staan in de XML die je richting webservice schopt. Ook staan volgens mij de headers normaal gesproken ook gewoon goed op basis van wat in de WDSL stond.

    Importeer je WSDL eens in SOAP UI en maak een test request aan. Dan kun je de geproduceerde XML zien en kun je ook testen wat je webservice doet.

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Moet je in die soap van jou niet een request invullen?

    Wat is het type van je request in je SOAP unit? Meestal moet je die eerst creeeren en dan vullen met iets. Dat komt van te staan in de XML die je richting webservice schopt. Ook staan volgens mij de headers normaal gesproken ook gewoon goed op basis van wat in de WDSL stond.
    Dat is nu net het punt.
    ValidateListRequest
    is mijn request welke een property header heeft, die verwijst naar
    KRHeaderType
    .
    Ook als ik ze aanmaak als object, krijg ik dezelfde foutmelding.

    Importeer je WSDL eens in SOAP UI en maak een test request aan. Dan kun je de geproduceerde XML zien en kun je ook testen wat je webservice doet.
    Dat heb ik al gedaan. Deze genereert vanuit de WSDL de benodigde SOAP XML. Daar kan ik bij de vraagtekens gegevens invoeren en dan een request op XML niveau uitvoeren. Dat ik dan de melding krijg dat de gebruiker niet bestaat is even een bijzaak.

    Waar het mij omgaat, is dat ik de procedure netjes kan doorlopen zonder foutmelding en dat in ieder geval uitkom bij SOAPkre.GetValidateList(Request)
    Delphi is great. Lazarus is more powerfull

  4. #4
    Jan
    Join Date
    Oct 2007
    Location
    Mijdrecht
    Posts
    906
    Waarom gebruik je niet de standaard functie die daarvoor gegeneerd wordt ?
    Voorbeeld van het ophalen van een lijst van diploma's via de standaard functie :

    Delphi Code:
    1. var D:TDiplomaData;
    2.                X:TDiplomaLijst;
    3.                I:integer;
    4.            begin
    5.               X:=GetIInschrijf(false, SAddr).GetDiplomaLijst;

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Omdat ik eerst parameters moet vullen om de juiste gegevens te krijgen.
    Delphi is great. Lazarus is more powerfull

  6. #6
    Jan
    Join Date
    Oct 2007
    Location
    Mijdrecht
    Posts
    906
    Als je een complex type als input hebt voor een operatie moet je uiteraard eerst een instantie creeeren.
    Dus zoiets :

    Code:
    Request := ValidateListRequest.Create;
    Header := KRHeadertype.Create;
    Header.Username := ...
    Request.header := Header;
    
    Response := Genereerde functie met httpprio(false,'http adres van de soap service').GetValidateList(Request);

  7. #7
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Juist. En waarom krijg ik dan een foutmelding: Project xxxx raised exception class $C0000005 with message 'access violation at 0x0040ae7e: write of address 0x0000000c'.
    0x0000000c geeft naar mij idee aan dat de class nog geen object is.
    Delphi is great. Lazarus is more powerfull

  8. #8
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Delphi Code:
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var SOAPkre  : KREPortType;
    3.     Request  : ValidateListRequest;
    4.     Response : ValidateListResponse;
    5.     Header   : KRHeaderType;
    6. begin
    7.     SOAPkre := GetKREPortType(True);
    8.     Request := ValidateListRequest.Create;
    9.     Header  := KRHeaderType.Create;
    10.     with Header do
    11.     begin
    12.       Username.Text := username;
    13.       Password.Text := wachtwoord;
    14.       Checksum.Text := checksum;
    15.       ExporterParty.PrimaryID.schemeID := kvk;
    16.     end;
    17.     Request.Header := Header;
    18.     Response := SOAPkre.GetValidateList(Request);
    19.  
    20.     Header.Free;
    21.     Request.Free;
    22. end;

    Dit is een stukje van de imported WSDL unit.

    Delphi Code:
    1. // ************************************************************************ //
    2.   // XML       : ValidateListRequest, global, <element>
    3.   // Serializtn: [xoLiteralParam]
    4.   // Info      : Wrapper
    5.   // ************************************************************************ //
    6.   ValidateListRequest = class(TRemotable)
    7.   private
    8.     FHeader: KRHeaderType;
    9.   public
    10.     constructor Create; override;
    11.     destructor Destroy; override;
    12.   published
    13.     property Header: KRHeaderType  read FHeader write FHeader;
    14.   end;
    15.  
    16. constructor ValidateListRequest.Create;
    17. begin
    18.   inherited Create;
    19.   FSerializationOptions := [xoLiteralParam];
    20. end;
    21.  
    22. destructor ValidateListRequest.Destroy;
    23. begin
    24.   System.SysUtils.FreeAndNil(FHeader);
    25.   inherited Destroy;
    26. end;
    27.  
    28. KRHeaderType = class(TRemotable)
    29.   private
    30.     FUsername: TextType;
    31.     FPassword: TextType;
    32.     FChecksum: TextType;
    33.     FChecksum_Specified: boolean;
    34.     FExporterParty: AgentPartyType;
    35.     procedure SetChecksum(Index: Integer; const ATextType: TextType);
    36.     function  Checksum_Specified(Index: Integer): boolean;
    37.   public
    38.     destructor Destroy; override;
    39.   published
    40.     property Username:      TextType        read FUsername write FUsername;
    41.     property Password:      TextType        read FPassword write FPassword;
    42.     property Checksum:      TextType        Index (IS_OPTN) read FChecksum write SetChecksum stored Checksum_Specified;
    43.     property ExporterParty: AgentPartyType  read FExporterParty write FExporterParty;
    44.   end;

    In principe geen rare dingen te zien.
    Ik begrijp een stukje in de help niet:
    Note: To create a class that represents scalar values that do not correspond directly to an Object Pascal type, use TRemotableXS as a base class instead. TRemotableXS is a descendant of the TRemotable class.
    Betekent dat ik de objecten verkeert inialiseert?. Dat zal 0x0000000c verklaren.
    Ik zie via de debugger dat het bij regel 10 fout gaat.
    Delphi is great. Lazarus is more powerfull

  9. #9
    Jan
    Join Date
    Oct 2007
    Location
    Mijdrecht
    Posts
    906
    Ik zie alleen dat je bij checksum ook een index mee moet geven.
    Of AgentPartyType een apart object is wat je ook nog moet createn kan ik niet zien.
    Nog een vraagje : wat is TextType ? Die ken ik niet ...
    Last edited by mesa57; 15-Mar-15 at 13:16.

  10. #10
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Delphi Code:
    1. // ************************************************************************ //
    2.   // XML       : TextType, global, <complexType>
    3.   // Namespace : urn:un:unece:uncefact:documentation:standard:CoreComponentType:2
    4.   // ************************************************************************ //
    5.   TextType = class(TRemotable)
    6.   private
    7.     FText: string;
    8.     FlanguageID: string;
    9.     FlanguageID_Specified: boolean;
    10.     FlanguageLocaleID: string;
    11.     FlanguageLocaleID_Specified: boolean;
    12.     procedure SetlanguageID(Index: Integer; const Astring: string);
    13.     function  languageID_Specified(Index: Integer): boolean;
    14.     procedure SetlanguageLocaleID(Index: Integer; const Astring: string);
    15.     function  languageLocaleID_Specified(Index: Integer): boolean;
    16.   published
    17.     property Text:             string  Index (IS_TEXT) read FText write FText;
    18.     property languageID:       string  Index (IS_ATTR or IS_OPTN) read FlanguageID write SetlanguageID stored languageID_Specified;
    19.     property languageLocaleID: string  Index (IS_ATTR or IS_OPTN) read FlanguageLocaleID write SetlanguageLocaleID stored languageLocaleID_Specified;
    20.   end;

    Het heeft iets te maken met de aanroep van classes, die het type TRemotable hebben, want als ik handmatig aanmaakt dan gaat het wel goed (via een aparte unit).
    Last edited by jkuiper; 15-Mar-15 at 17:23.
    Delphi is great. Lazarus is more powerfull

  11. #11
    Je hebt wel een ongelofelijke bagger WSDL uitgekozen om mee te starten.

    Gokje, maar ik denk dat je username en andere velden ook eerst gecreerd moeten worden. Pas daarna kun je ze vullen met property Text.

  12. #12
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik heb die bagger niet geschreven, Benno

    Maar ik denk dat ik het bij hier moet gaan zoeken. Morgen weer een dag. Heb een klusje te doen.
    Delphi is great. Lazarus is more powerfull

  13. #13
    Jan
    Join Date
    Oct 2007
    Location
    Mijdrecht
    Posts
    906
    Nee, het heeft niks met TRemotable of soap headers te maken.
    Zoals Benno al zei : alle zogenaamde complex types, die afgeleid zijn van TRemotable, zul je moeten creeëren.
    Ze hebben het inderdaad wel een beetje complex gemaakt zo.
    Classes die afgeleid zijn van TRemotable worden geserialiseerd bij de soap aanroep. Anderen niet.

  14. #14
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Je hebt gelijk. Het heeft niets met de headers te maken. Alle params staat in de body.

    Ga ik even voor op het internet kijken. Ik upload een voorbeeld inclusief de WSDL import file. Moch iemand daar naar willen kijken en mij een duwtje in de goed richting wilt geven; graag.
    Attached Files Attached Files
    Delphi is great. Lazarus is more powerfull

  15. #15
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Moet ik de xml ook importeren vanuit de xsd. Ik dacht dat je alleen de WSDL import nodig had, maar ik kan daar volledig naast mee zitten.
    Echter met voorbeelden op het internet gebeurt dat niet.
    Delphi is great. Lazarus is more powerfull

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •