Page 2 of 3 FirstFirst 1 2 3 LastLast
Results 16 to 30 of 35

Thread: Handmatige aanroep webservice?

  1. #16
    Ok, ik weet niet of het bovenstaande te simpel is of niet, maar met deze uitgebreide versie daarvan, wil het ook niet.

    Code:
    function SendSoapMessage(const AMessage: String): String;
    var
    lHTTPClient : TIdHTTP;
    lMessage : TStringList;
    begin
      lHTTPClient := TIdHTTP.Create(nil);
      lMessage := TStringList.Create;
      try
        lMessage.Text := AMessage + ' ';
        lHTTPClient.Host := cServer;
        lHTTPClient.Port := cPort;
        lHTTPClient.HTTPOptions := [];
        lHTTPClient.ProtocolVersion := pv1_1;
        lHTTPClient.Request.Method := hmPost;
        lHTTPClient.Request.ContentType := 'text/xml';
        Result := lHTTPClient.Post( cPostUrl, lMessage );
      finally
        lMessage.Free;
        lHTTPClient.Free;
      end;
    end;
    Zoals je ziet gebruik ik hier constantes, welke ik niet kan geven helaas. Maar als ik in die constantes wat onzin zet, dan krijg je wel andere errors waaruit ie laat merken dat ie het dan niet kan vinden. Dus de constantes kloppen wel.

    Maar ik krijg nog steeds de EIdHttpProtocolException met de message 'Http/1.1 500 internal server error'... zou de webservice niet helemaal goed zijn?
    via de site van perfectxml.com kan ik em testen en dat werkt volledig..

    iemand nog tips?

  2. #17
    hmm, eigenlijk zou ik dit stukje code moeten testen op een andere webservice..

    Edit:

    Als ik de functie die ik wil aanroepen van de webservice er achter zet met een #, zoals beschreven staat in de wsdl, dan verandert er helemaal niks. Dit zet ik dan achter de url (cPostUrl)..
    Last edited by GreenSky; 11-Jan-07 at 21:24.

  3. #18
    Ik ben wel lekker aan het posten zo
    maar ik heb deze error nu op de website test weten te krijgen.
    Dit is de test site van perfectxml.com waar ik het over had:
    http://www.perfectxml.com/SOAPTestClient.asp

    Als ik op deze pagina alles invul net als normaal (wanneer het dus werkt) en ik laat daarbij SoapAction weg (soap action is een deel van de Post URL, alles na 'http://www.domein.nl:3456'), dan krijg ik ook de 500 internal server error.

    Dus ik moet blijkbaar de SoapAction nog meegeven, naast de post URL.. concludeer ik dan. Hmm... uitzoeken hoe ik dat voor elkaar krijg..

  4. #19
    Ok, weeeer een post, heb het nog niet opgelost, maar mijn vermoedens zijn wel bevestigd, nu ik (dankzij dit forum!) de fatsoenlijke error message eruit heb kunnen krijgen, idd geen SoapAction header:



    Dit is wat ik er nu bij heb gezet, maar wat nu niets veranderd heeft aan de situatie:
    Code:
    lHTTPClient.Request.CustomHeaders.Add( 'SOAPAction=' + cSoapAction );

  5. #20
    Als ik morgen op mijn werk ben, dan zal ik eens even kijken hoe bij mij het netwerkverkeer tussen de client en de webservice eruit ziet. Misschien dat je daar dan nog wat aan hebt.

  6. #21
    Dank je wel.

    in deze thread:
    http://www.nldelphi.com/Forum/showthread.php?t=26330
    kan je zien dat de HTTPRIO flags heeft om dit probleem te voorkomen:
    - soNoSOAPActionHeader
    - soNoValueForEmptySOAPAction
    Dan neemt ie genoegen met de header in de xml oid..

    Maar IdHttp heeft deze flags dus niet. En de enige manier om HTTPRIO te gebruiken om wat te versturen is met een door de WSDL importer gegenereerde interface..
    misschien moet ik maar even de werkende XML verder nakijken. misschien vind ie de header niet goed genoeg oid.

    Heb jij de WDSL werkend kunnen krijgen Chris? jij werkt toch gewoon met de door de WSDL gegenereerde objecten?

  7. #22
    Ok nu snap ik het even niet meer. En dat terwijl ik zo dichtbij ben.

    wat ik nu heb gedaan:
    - overgestapt op HTTPRIO, de eerder genoemde flags aangezet.
    - WSDL weer ge-import, fouten eruit gehaald (maar zou nooit kunnen werken op die manier, mist wat)
    - De zojuist gegenereerde interface aanspreken op de HTTPRIO, en de functie aanspreken met nil als argumenten.
    - het waardeloze soapbericht in de HTTPRIOBeforeExecute vervangen door het goeie bericht.
    - in de HTTPRIOAfterExecute de response laden, in een memo.

    zie de code:

    Code:
    procedure TSecondForm.HTTPRIOAfterExecute(const MethodName: String;
      SOAPResponse: TStream);
    var
      buffer : String;
    begin
      ShowMessage( 'SOAPResponse.Size = ' + IntToStr( SOAPResponse.Size ) );
    
      //aan het begin zetten
      try
        SOAPResponse.Position := 1;
      except
        on E: Exception do
          ShowMessage( E.Message );
      end;
    
      //inlezen in memo zetten
      try
        OutputMemo.Lines.LoadFromStream( SOAPResponse );
      except
        on E: EReadError do
          ShowMessage( E.Message );
      end;
    end;
    Maaarrr... bij HTTPRIOAfterExecute komt er een Stream uit.. wat natuurlijk geen probleem is. Via de ShowMessage kom ik erachter dat ie zelfs 598 groot is! Dus daar zit een fatsoenlijke XML/Soap reactie achter denk ik dan!
    Maar ik krijg em niet uitgelezen. Ik moet hem eerst op .Position := 0; zetten, maar dit werkt niet. Ik krijg een access violation error, en niet een "gewone", maar eentje waarbij je een CPU schermpje krijgt van de Borland studio, en dat je dus gewoon niet verder kan. Terwijl ik ditzelfde in een ander topic op dit forum wel zie werken. Dit topic:
    http://www.nldelphi.com/forum/show...
    Dat snap ik dus echt niet.. alles gaat goed behalve even de Stream op 0 zetten dat ik em kan lezen.. en dat gaat goed fout ook.

    Iemand een idee?
    Last edited by GreenSky; 12-Jan-07 at 00:14.

  8. #23
    Voor de zekerheid: in je code hier zet je de position op 1 en niet op 0. Is dat in je echte code ook zo? Het moet 0 zijn. En ik zou dat ook als eerste doen.
    Marcel

  9. #24
    Ok dit is vaag. Ik zou toch zweren dat ik het met een 0 en een 1 heb geprobeerd, om niet zo'n 1-0ff foutje te hebben. 0 had ik ook als eerste geprobeerd.
    Nu doe ik weer 0, werkt het wel! Nou ja, ben iig blij dat het werkt. Dankje.

    Nu even onderzoeken of het een zinnige reactie is, hij kan de bericht identificatie niet lezen.

    Ik krijg een ander bericht terug dan wanneer ik em op die perfectxml.com site test.. vaag.
    wacht.. ik krijg meer terug dan via de test op PerfectXML. daar krijg ik alleen een ontvangsbevestiging,
    hier krijg ik een ontvangsbevestiging + een signaal code wat hoort omdat er onzin in staat (maar klopt wel met XSD's)

    Volgens mij heb ik hier genoeg aan, even in een mooie Unit verpakken en klaar. SSL gebeuren moet nog even wachten denk ik.

    Dank je wel allemaal!

    Hier de ietwat smerige oplossing:
    Code:
    procedure TSecondForm.HTTPRIOBeforeExecute(const MethodName: String;
      var SOAPRequest: WideString);
    begin
      SOAPRequest := InputMemo.Lines.Text;
    end;
    
    
    procedure TSecondForm.HTTPRIOAfterExecute(const MethodName: String;
      SOAPResponse: TStream);
    var
      buffer : String;
    begin
      ShowMessage( 'SOAPResponse.Size = ' + IntToStr( SOAPResponse.Size ) );
    
      //aan het begin zetten
      try
        SOAPResponse.Position := 0;
      except
        on E: Exception do
          ShowMessage( E.Message );
      end;
    
      //inlezen in memo zetten
      try
        OutputMemo.Lines.LoadFromStream( SOAPResponse );
      except
        on E: EReadError do
          ShowMessage( E.Message );
      end;
    end;
    Je moet hiervoor dus niet eens die soapheader flags aan hebben staan!
    Last edited by GreenSky; 12-Jan-07 at 00:54.

  10. #25
    Shit, ik heb te vroeg gejuicht. Deze oplossing werkt dus niet...
    Het lijkt niet uit te maken wat ik ook in de SoapRequest variabele zet van het HTTPRIOBeforeExecute event, want hij geeft altijd dezelfde message terug. Dit is een ontvangsbericht waarin staat: "Kan de berichtidentificatie niet lezen"
    SoapRequest is een var, en geen const. Zou ie aanpassingen hierin toch niet meenemen?
    Ik kan namelijk goeie xml of helemaal niks ( '' ) meegeven, maar het maakt allemaal niet uit. Krijg hetzelfde terug. En dat terugbericht zou wel kloppen voor de XML waar ie zelf mee komt, omdat ik de functie aanroep met nil waardes.
    Iemand een idee/mening hierover?

  11. #26
    Ok wat ik met het Babelfish probeerseltje heb getest blijkt dat de var SoapRequest van het event BeforeRequest geen nieuwe waardes opneemt. Je kan erin stoppen wat je wil, maar hij doet er niets mee. Zou je toch anders verwachten aangezien het een var is, en geen const..

    Dan moet ik het denk ik toch op die IdHTTP toer gooien, en uitvinden hoe ik die SoapAction headers mee kan geven.

  12. #27
    Ik heb nu ook het e.e.a. geprobeerd met MSXML:

    Code:
    procedure TForm1.Test;
    var
      XMLhttp : Variant;
    begin
      XMLhttp := CreateOleObject('MSXML2.ServerXMLHTTP.3.0');
      XMLhttp.Open( 'POST', cServiceUrl, False );
      XMLhttp.setRequestHeader( 'SOAPAction', cPostUrl );
      XMLhttp.setRequestHeader( 'Content-Type', 'text/xml' );
      XMLhttp.Send( InputMemo.Lines.Text );
      OutputMemo.Lines.Text := XMLhttp.responseText;
    end;
    Hiermee heb ik de No SOAPaction header! fout mee verholpen. Maar vervolgens krijg ik een Soap VersionMismatch error
    Het maakt hiervoor niet uit of ik de ServerXMLhttp gebruik, of de gewone XMLhttp.

    Iemand ervaring hiermee? (met het gebruik van msxml objecten met soap)

  13. #28
    Ok update:

    Ik heb nu een vergelijkbare test met de Babelfish webservice gedaan. Ik heb eerst een programmaatje geschreven (die had ik al) wat gebruikt maakt van de babelfish webservice om wat te vertalen. Daarbij heb ik braaf de WSDL importer gebruikt, en het werkt allemaal. Daar heb ik vervolgens het automatisch gegenereerde XML bericht uitgehaald.

    Dit XML bericht (soap request) heb ik vervolgens met MSXML objecten opnieuw geprobeerd te versturen. Hierbij zet ik zelf de SOAPAction header en Content-Type header. (hiermee voorkom ik dus die no soapaction header error)
    Maar ook hierbij krijg ik een Soap VersionMismatch error!
    Met wat hulp van ChrisF kwam ik erachter dat er nog een header was: User-Agent, die via WSDL importer spul automatisch op Borland SOAP 1.2 wordt gezet. Dit heb ik inmiddels ook zelf uitgevonden door het e.e.a. op het netwerk af te luisteren met wireshark(.org)
    Maar dit hielp allemaal niet. Ik heb nog het e.e.a. geprobeerd om de headers gelijk te krijgen, maar het helpt allemaal niet.

    Hier de iets duidelijkere soap version mismatch error van de babelfish service:
    Code:
    <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode xsi:type="xsd:string">
    
    SOAP-ENV:VersionMismatch
    
    </faultcode><faultstring xsi:type="xsd:string">
    
    Wrong SOAP version specified. Supported versions:
      1.1 (http://schemas.xmlsoap.org/soap/envelope/)
      1.2 (http://www.w3.org/2001/06/soap-envelope)
    
    
    </faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
    Hier de headers van de automatische aanroep:
    Code:
    Hypertext Transfer Protocol
        POST /perl/soaplite.cgi HTTP/1.1\r\n
            Request Method: POST
            Request URI: /perl/soaplite.cgi
            Request Version: HTTP/1.1
        SOAPAction: "urn:xmethodsBabelFish#BabelFish"\r\n
        Content-Type: text/xml\r\n
        User-Agent: Borland SOAP 1.2\r\n
        Host: services.xmethods.net\r\n
        Content-Length: 569
        Connection: Keep-Alive\r\n
        Cache-Control: no-cache\r\n
        \r\n
    Hier de headers van de handmatige aanroep:
    Code:
    Hypertext Transfer Protocol
        POST /perl/soaplite.cgi HTTP/1.1\r\n
            Request Method: POST
            Request URI: /perl/soaplite.cgi
            Request Version: HTTP/1.1
        SOAPAction: BabelFishService\r\n
        Content-Type: text/xml\r\n
        User-Agent: Borland SOAP 1.2\r\n
        Accept-Language: nl\r\n
        Content-Length: 603
        Accept: */*\r\n
        Host: services.xmethods.net\r\n
        Connection: Keep-Alive\r\n
        \r\n
    Zoals je ziet zijn er een aantal verschillen:
    - klein verschil in SoapAction header: heb ik al aangepast
    - Cache-Control: heb ik er ook bijgezet

    en daarna blijven alleen Accept en Accept-Language over. Deze kunnen toch niet dat verschil maken? Als in, heeft weinig met soap version te maken lijkt mij.
    Bovendien weet ik niet hoe ik deze uit de msxml header lijst kan halen. Of er bij de RIO erin kan zetten (om te kijken of het normale babelfish programmaatje dan ook dezelfde error geeft).

    Dus..

    Jullie kunnen met deze compleet vergelijkbare situatie gewoon vrolijk meetesten:
    Normale babelfish projectje:
    http://greensky.nl/dev/babelfishnormaal.rar
    Met MSXML met soap version mismatch error:
    http://greensky.nl/dev/babelfishmsxml.rar

    Wie mij de doorslaggevende tip/oplossing kan geven, ben ik heel erg dankbaar
    Last edited by GreenSky; 19-Jan-07 at 18:12.

  14. #29
    Voor dit soort problemen is Fiddler een handige tool. Deze vangt je HTTP verkeer af (proxy). Je kunt er ook zelf HTTP requests mee bouwen.

    Mag ik jou content van de twee HTTP requests ook eens zien?

  15. #30
    Ik zal op een later tijdstip nog even kijken naar Fiddler, bedankt.

    Hier de volledige twee request:

    Werkende met WSDl importer etc
    Code:
    No.     Time        Source                Destination           Protocol Info
          8 10.906139   192.168.0.106         64.124.140.30         HTTP/XML POST /perl/soaplite.cgi HTTP/1.1
    
    Frame 8 (859 bytes on wire, 859 bytes captured)
    Ethernet II, Src: Micro-St_af:34:c7 (00:11:09:af:34:c7), Dst: SitecomE_1d:eb:d9 (00:0c:f6:1d:eb:d9)
    Internet Protocol, Src: 192.168.0.106 (192.168.0.106), Dst: 64.124.140.30 (64.124.140.30)
    Transmission Control Protocol, Src Port: 2285 (2285), Dst Port: http (80), Seq: 1, Ack: 1, Len: 805
    Hypertext Transfer Protocol
        POST /perl/soaplite.cgi HTTP/1.1\r\n
            Request Method: POST
            Request URI: /perl/soaplite.cgi
            Request Version: HTTP/1.1
        SOAPAction: "urn:xmethodsBabelFish#BabelFish"\r\n
        Content-Type: text/xml\r\n
        User-Agent: Borland SOAP 1.2\r\n
        Host: services.xmethods.net\r\n
        Content-Length: 569
        Connection: Keep-Alive\r\n
        Cache-Control: no-cache\r\n
        \r\n
    eXtensible Markup Language
        <?xml
            version="1.0"
            ?>
        <SOAP-ENV:Envelope
            xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
            <SOAP-ENV:Body
                SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                <NS1:BabelFish
                    xmlns:NS1="urn:xmethodsBabelFish">
                    <translationmode
                        xsi:type="xsd:string">
                        nl_en
                        </translationmode>
                    <sourcedata
                        xsi:type="xsd:string">
                        WSDL Import test
                        </sourcedata>
                    </NS1:BabelFish>
                </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>
    Hier de manuele (met soap version mismatch error)
    Code:
    No.     Time        Source                Destination           Protocol Info
         27 53.520754   192.168.0.106         64.124.140.30         HTTP/XML POST /perl/soaplite.cgi HTTP/1.1
    
    Frame 27 (885 bytes on wire, 885 bytes captured)
    Ethernet II, Src: Micro-St_af:34:c7 (00:11:09:af:34:c7), Dst: SitecomE_1d:eb:d9 (00:0c:f6:1d:eb:d9)
    Internet Protocol, Src: 192.168.0.106 (192.168.0.106), Dst: 64.124.140.30 (64.124.140.30)
    Transmission Control Protocol, Src Port: 2290 (2290), Dst Port: http (80), Seq: 1, Ack: 1, Len: 831
    Hypertext Transfer Protocol
        POST /perl/soaplite.cgi HTTP/1.1\r\n
            Request Method: POST
            Request URI: /perl/soaplite.cgi
            Request Version: HTTP/1.1
        SOAPAction: BabelFishService\r\n
        Content-Type: text/xml\r\n
        User-Agent: Borland SOAP 1.2\r\n
        Accept-Language: nl\r\n
        Content-Length: 603
        Accept: */*\r\n
        Host: services.xmethods.net\r\n
        Connection: Keep-Alive\r\n
        \r\n
    eXtensible Markup Language
        <?xml
            version="1.0"
            ?>
        <SOAP-ENV:Envelope
            xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope\r\n/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding\r\n/">
            <SOAP-ENV:Body
                SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/e\r\nncoding/">
                <NS1:BabelFish
                    xmlns:NS1="urn:xmethodsBabelFish">
                    <translationmode
                        xsi:type="xsd:string">
                        nl_en
                        </translationmode>
                    <sourcedata
                        xsi:type="xsd:string">
                        Directe MSXML test
                        </sourcedata>
                    </NS1:BabelFish>
                </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>

Page 2 of 3 FirstFirst 1 2 3 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
  •