soap-client icon indicating copy to clipboard operation
soap-client copied to clipboard

Import schema

Open victorgp89 opened this issue 7 years ago • 28 comments

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

victorgp89 avatar Sep 26 '18 07:09 victorgp89

is the file mentioned by the error accessible?

goetas avatar Sep 26 '18 07:09 goetas

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

victorgp89 avatar Sep 26 '18 08:09 victorgp89

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

victorgp89 avatar Sep 26 '18 09:09 victorgp89

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 avatar Sep 26 '18 09:09 goetas

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

goetas avatar Sep 26 '18 09:09 goetas

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

victorgp89 avatar Sep 26 '18 10:09 victorgp89

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();

goetas avatar Sep 26 '18 10:09 goetas

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

victorgp89 avatar Sep 26 '18 11:09 victorgp89

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

goetas avatar Sep 26 '18 11:09 goetas

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

goetas avatar Sep 26 '18 11:09 goetas

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 ?

goetas avatar Sep 26 '18 11:09 goetas

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

image

victorgp89 avatar Sep 26 '18 12:09 victorgp89

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);

goetas avatar Sep 26 '18 12:09 goetas

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

victorgp89 avatar Sep 26 '18 12:09 victorgp89

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

goetas avatar Sep 26 '18 12:09 goetas

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

goetas avatar Sep 26 '18 12:09 goetas

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

victorgp89 avatar Sep 26 '18 12:09 victorgp89

:/

goetas avatar Sep 26 '18 12:09 goetas

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 avatar Sep 26 '18 13:09 victorgp89

And in getRoomsInput I have this:

image

And I've another error: image

victorgp89 avatar Sep 26 '18 14:09 victorgp89

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

victorgp89 avatar Sep 26 '18 15:09 victorgp89

@riccardonar did you face an issue as this?

goetas avatar Sep 26 '18 15:09 goetas

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.

victorgp89 avatar Sep 26 '18 15:09 victorgp89

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

goetas avatar Sep 26 '18 15:09 goetas

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

riccardonar avatar Sep 26 '18 19:09 riccardonar

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 avatar Sep 27 '18 07:09 victorgp89

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 avatar Sep 27 '18 08:09 victorgp89

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

image

victorgp89 avatar Sep 27 '18 08:09 victorgp89