goetas-webservices / soap-client

PHP implementation of SOAP 1.1 and 1.2 client specifications
MIT License
175 stars 28 forks source link

Import schema #29

Open victorgp89 opened 5 years ago

victorgp89 commented 5 years ago

Hi, A question, When a wsdl has importacions like: <xsd:import namespace="http://ws.link.hotelresb2b.com/login" schemaLocation="Link?xsd=login.xsd"/>

When I execute the command: vendor/bin/soap-client -vvv generate config/config_hotusa.yml src/Service/Container --dest-class=Igm/Synergy/Service/Container/SoapContainerHotusa

I've an error in the SchemaReader.php

image

In all the metadata that I have generated with WSDL without imports, I haven't had any problems.

Thanks for advance, Victor

goetas commented 5 years ago

is the file mentioned by the error accessible?

victorgp89 commented 5 years ago

Yes , http://ws.link.test.hotelresb2b.com/axis2/services/Link?xsd=login.xsd

victorgp89 commented 5 years ago

And when I wrap the xml with some headers like this:

image

How should I create the corresponding object in the headers?

Many thanks, Victor

goetas commented 5 years ago

is the file mentioned by the error accessible?

Can it be that the PHP client is not allowed to access the file for same reason? from what I know it is the only reason for that error

goetas commented 5 years ago

How should I create the corresponding object in the headers?

you should use GoetasWebservices\SoapServices\SoapClient\Arguments\Headers\Header, see https://github.com/goetas-webservices/soap-client/blob/746570af24e24ffa363264f8676a55763c044bf6/tests/Client/Client12RequestResponsesTest.php#L173 for an example

victorgp89 commented 5 years ago

Sorry for the response, I will not bother you anymore.

We have this in metadata and SoapContainer.

image

We need to execute the following request:

image

Following your example we create the corresponding object:

$client->getRooms($rq, new \GoetasWebservices\SoapServices\SoapClient\Arguments\Headers\Header($userValidation));

$rq is an instanceof of the RequestRooms php class.

And when call this process we have following error in ArgumentReader: PHP Notice: Undefined index: requestRoomsHeader in /var/www/igm_client/vendor/igm/synergyclient/src/Arguments/ArgumentsReader.php on line 66 PHP Fatal error: Call to a member function setValue() on null in /var/www/igm_client/vendor/igm/synergyclient/src/Arguments/ArgumentsReader.php on line 67

It would be very helpful if you could give us some reason for the error.

Many thanks

goetas commented 5 years ago

I guess you have forgot to register the Header handler as in https://github.com/goetas-webservices/soap-client/blob/746570af24e24ffa363264f8676a55763c044bf6/tests/Client/Client12RequestResponsesTest.php#L67

if you are suing SoapContainerBuilder::createSerializerBuilderFromContainer You can do it via:

$serializer = SoapContainerBuilder::createSerializerBuilderFromContainer($container, function($registry) {
   $registry->registerSubscribingHandler(new HeaderHandler());
})->build();
victorgp89 commented 5 years ago

No,

I think the problem is in ArgumentsReader when the serviceDefinition have many parts.

In method handleHeaders you set in envelope the instance of the headers and return the body.

So now we have this content:

In variable args:

image

And in input['parts']: image

So, always throw at this point in code: image

goetas commented 5 years ago

Hmm... may be a bug, but not sure about it.

goetas commented 5 years ago

Can you copy/paste your soap operaton for this call? im confused by the "requestRoomsHeader" in the "parts" array.

goetas commented 5 years ago

Is the header defined also at SOAP metadata level or not? does it look as something as https://github.com/goetas-webservices/soap-client/blob/746570af24e24ffa363264f8676a55763c044bf6/tests/Fixtures/test.wsdl#L511 ?

victorgp89 commented 5 years ago

Here is the wsdl if you want to check but is allright I think: image

image

goetas commented 5 years ago

It looks a bug. I did not find anything that tests that case in my test suite.

Can you try to without wrapping the header param in \GoetasWebservices\SoapServices\SoapClient\Arguments\Headers\Header ?:

$client->getRooms($rq, $userValidation);
victorgp89 commented 5 years ago

If I pass GetRoomsInput directly like:

screenshot - 260918 - 14 02 24

I've another error: PHP Fatal error: Call to a member function value() on string in /var/www/igm_client/vendor/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php on line 105

And also call the function with your parameters like this: screenshot - 260918 - 14 05 34

goetas commented 5 years ago

but you are still using \GoetasWebservices\SoapServices\SoapClient\Arguments\Headers\Header. Can you try without?

goetas commented 5 years ago

like $client->getRooms($rq, $hotel).

victorgp89 commented 5 years ago

Yes, if you pass like this: $client->getRooms($rq, $userValidation);

I've this error: PHP Notice: Undefined index: requestRoomsHeader in /var/www/igm_client/vendor/igm/synergyclient/src/Arguments/ArgumentsReader.php on line 71 PHP Fatal error: Call to a member function setValue() on null in /var/www/igm_client/vendor/igm/synergyclient/src/Arguments/ArgumentsReader.php on line 72

goetas commented 5 years ago

:/

victorgp89 commented 5 years ago

But I don't understand if I create request and set the body and header manually like:

screenshot - 260918 - 15 13 44

When I serialize to convert in XML it return followin error: PHP Fatal error: Call to a member function value() on integer in /var/www/igm_client/vendor/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php on line 104

victorgp89 commented 5 years ago

And in getRoomsInput I have this:

image

And I've another error: image

victorgp89 commented 5 years ago

If the problem if this header: image

Can I do this? image

MyHandler is with o without namespace?

I want to do this to avoid the following: image

goetas commented 5 years ago

@riccardonar did you face an issue as this?

victorgp89 commented 5 years ago

Because this class: type: 'GoetasWebservices\SoapServices\SoapEnvelope\Headers<''Igm\Synergy\Definitions\Hotusa\Login\UserValidation''>'

Doesn't exist. It's posible to fix this? I do anything wrong? How it works?

Many thanks for attention.

goetas commented 5 years ago

Should be GoetasWebservices\SoapServices\SoapEnvelope2\Headers.... @riccardonar ?

riccardonar commented 5 years ago

did you face an issue as this?

Mmm, i check that in my SOAPs i haven't any header part in the operations, so i don't test it

victorgp89 commented 5 years ago

Where you construct this part of metadatas?

`'GoetasWebservices\SoapServices\SoapEnvelope\Headers<''Igm\Synergy\Definitions\Hotusa\Login\UserValidation''>'

Because If i extrat the part the namespace of the class in there that's work correctly.

image

`

victorgp89 commented 5 years ago

Because when you pass Header like you tell me:

$client->getRooms($rq, $userValidation);

In Arguments reader you set empty class HeaderPlaceHolder to envelope and it throws an error cause argument is not the correct instance.

Is that for something?

image

victorgp89 commented 5 years ago

We can do this but I'm not sure that if it's how you thought.

image