lula / ngx-soap

Simple SOAP client for Angular
MIT License
66 stars 61 forks source link

Partially initialized client for complex WSDL #43

Open jcharlytown opened 5 years ago

jcharlytown commented 5 years ago

There is an issue with importing WSDL definitions with imported XSDs. The promise for _requestWSDL actually completes before all imports have been processed and the WSDL has been parsed completely. As a consequence, the client gets initialized with an incomplete WSDL definition and is lacking ports. I guess there is a good chance that some of the Method not found issues reported here actually stem from this issue. At least this is the error I got. In order to reproduce the issue I attached console.log(JSON.stringify(client.wsdl.definitions.services)); to the createClient Promise. The tricky part is that the client.wsdl gets modified in-place and the debugging console updates accordingly.

A dirty workaround to avoid the issue is to call into client.setEndpoint(' '); using setTimeout() in order to trigger the client to "reparse" the hopefully by then completely parsed WSDL.

If it is helpful I can definitely supply the WSDL which is affected for me. Am I reading the clues correctly or am I missing something?

irudji commented 5 years ago

Hi jcharlytown

I have same issue with missing methods when importing from WSDL with XSDs. Please, can you share your "dirty" solution how you solved it?

Thanks a lot

PedroDominMor commented 5 years ago

@lula any solution about this?

jcharlytown commented 5 years ago

I can share my solution, I forgot about this. Won't get to it until tomorrow throughAm 24.04.2019 09:17 schrieb PedroDominMor notifications@github.com:@lula any solution about this?

—You are receiving this because you authored the thread.Reply to this email directly, view it on GitHub, or mute the thread.

lula commented 5 years ago

Hello guys! Sorry for delay. Have you tried with node soap? Please remember that this is a porting from server lib.

So I did a quick test and it doesn't seem to work for me, although I might have created the wsdl and xsd not correctly. @jcharlytown can you perhaps share a repo with a sample to test with?

jcharlytown commented 5 years ago

Hi, sorry for the delay. I solved it like this:

private createService(uri: string): Promise<Client>
{
    return new Promise((resolve, _) =>
    {
        this.soap.createClient(uri, { disableCache: true }).then((c: Client) =>
        {
            // HACK: https://github.com/lula/ngx-soap/issues/43
            setTimeout(() =>
            {
                c.setEndpoint('');
                // console.log(c.describe());
                // console.log(c);
                resolve(c);
            }, 3000);
        });
    });
}

The setTimeout "ensures" that the entire schema has been fetched and parsed and the ports have been set up.

As to an example: I needed to connect to a SOAP service based on this schema: https://fachportal.gematik.de/fileadmin/user_upload/fachportal/files/Spezifikationen/Produktivbetrieb/Schemata_WDSL/OPB3.0_Schemadateien_R300.zip

More precisely, I used conn/vsds/VSDService.wsdl as entrypoint so to speak. I have the entire schema definitions shipped with my angular app as an asset. In order to make it work I had to modify the schemas slightly (although I do not fully understand whether this is a incompatibility with this library specifically or a general issue with the definitions). There is a patch file attached to this comment.

Once that's done, I load the service from angular like this:

const vsdServiceUri = window.location.origin + '/assets/data/ehealth-gematik/conn/vsds/VSDService.wsdl';
this.vsdService = this.createService(vsdServiceUri);

I hope this helps to track down the underlying issue. Let me know if can assist some more - it'll take a while though for me to put more effort into this.

Patch: 0001-Fix-VSDService-ngx-soap-compatability.tar.gz