StockKeepingUnitComplementInsertUpdate parâmetro faltando?

Estou tentando enviar via soap para este método... mas está dizendo q o objeto nao pode ser nulo... o que esta incorreto?

Dados enviados:

Array

(

[StockKeepingUnitComplement] => Array

(

[StockKeepingUnitId] => 10514

[StockKeepingUnitComplement] => Array

(

[0] => 13223

[1] => 13226

[2] => 13365

)

[ComplementType] => suggestion

)

)

October 8, 2018, 5:56 pm -> Value cannot be null. Parameter name: O objeto StockKeepingUnitComplement não pode ser nulo. |

Pessoal há alguma inconsistência com esse método.. ja abri Ticket a mais de uma semana e o suporte não enviou uma solução...............

Qual linguagem está usando ?

Aqui nossa integração é escrita em C# e usamos esse método na variante async sem problemas...

Faça um teste, instale o CharlesProxy ou o Fiddler4 na sua máquina e execute a chamada ao método. Olhe no Charles ou no Fiddler a requisição XML (SOAP) e cola ela aqui!

Enviando:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:vtex="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">

<soapenv:Header/>

<soapenv:Body>

<tem:StockKeepingUnitComplementInsertUpdate>

<!--Optional:-->

<tem:objStockKeepingUnitComplementDTO>

<!--Optional:-->

<vtex:ComplementType>Similary</vtex:ComplementType>

<!--Optional:-->

<vtex:StockKeepingUnitComplements>

<!--Zero or more repetitions:-->

<arr:int>10515</arr:int>

</vtex:StockKeepingUnitComplements>

<!--Optional:-->

<vtex:StockKeepingUnitId>10514</vtex:StockKeepingUnitId>

</tem:objStockKeepingUnitComplementDTO>

</tem:StockKeepingUnitComplementInsertUpdate>

</soapenv:Body>

Recebendo:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

<s:Body>

<s:Fault>

<faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:DeserializationFailed</faultcode>

<faultstring xml:lang="pt-BR">The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:objStockKeepingUnitComplementDTO. The InnerException message was 'Invalid enum value 'Similary' cannot be deserialized into type 'Vtex.Commerce.WebApps.AdminWcfService.Contracts.StockKeepingUnitComplementDTO+ComplementTypeEnum'. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'. Please see InnerException for more details.</faultstring>

<detail>

<ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

<HelpLink i:nil="true"/>

<InnerException>

<HelpLink i:nil="true"/>

<InnerException i:nil="true"/>

<Message>Invalid enum value 'Similary' cannot be deserialized into type 'Vtex.Commerce.WebApps.AdminWcfService.Contracts.StockKeepingUnitComplementDTO+ComplementTypeEnum'. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.</Message>

<StackTrace>at System.Runtime.Serialization.EnumDataContract.ReadEnumValue(String value, Int32 index, Int32 count)

at System.Runtime.Serialization.EnumDataContract.ReadEnumValue(XmlReaderDelegator reader)

at System.Runtime.Serialization.EnumDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)

at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract&amp; dataContract)

at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns)

at ReadStockKeepingUnitComplementDTOFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[] )

at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)

at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract&amp; dataContract)

at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)

at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)

at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)

at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)

at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo.ReadObject(XmlDictionaryReader reader, XmlObjectSerializer serializer)

at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)</StackTrace>

<Type>System.Runtime.Serialization.SerializationException</Type>

</InnerException>

<Message>The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:objStockKeepingUnitComplementDTO. The InnerException message was 'Invalid enum value 'Similary' cannot be deserialized into type 'Vtex.Commerce.WebApps.AdminWcfService.Contracts.StockKeepingUnitComplementDTO+ComplementTypeEnum'. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'. Please see InnerException for more details.</Message>

<StackTrace>at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)

at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters, Boolean isRequest)

at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)

at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)

at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)

at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc&amp; rpc)

at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)

at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)

at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)

at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</StackTrace>

<Type>System.ServiceModel.Dispatcher.NetDispatcherFaultException</Type>

</ExceptionDetail>

</detail>

</s:Fault>

</s:Body>

</s:Envelope>

Suporte:

Gustavo Rios

Segunda-feira às 00:33

Oi Alan!

O problema ​está no campo ComplementType.

Deve ser passado o ID:

1 -> para Sugestões

2 -> para Similares

3 -> para Acessórios

Fico aguardando seu retorno para saber se vai funcionar agora.

Abraços!

?

Você precisa enviar o número do tipo de complemento ao invés do texto, como você está fazendo hoje...

Por exemplo, ao invés de enviar assim:

Array

(

[StockKeepingUnitComplement] => Array

(

[StockKeepingUnitId] => 10514

[StockKeepingUnitComplement] => Array

(

[0] => 13223

[1] => 13226

[2] => 13365

)

[ComplementType] => suggestion

)

)

Você deveria enviar o número que representa a suggestion, que no caso é 1

Array

(

[StockKeepingUnitComplement] => Array

(

[StockKeepingUnitId] => 10514

[StockKeepingUnitComplement] => Array

(

[0] => 13223

[1] => 13226

[2] => 13365

)

[ComplementType] => 1

)

)

Já foi feito guilherme, o erro é o que colei acima mesmo enviando 1 ou 2 ou 3

?

Manda o SOAP de requisição, enviando como você está fazendo agora por favor

try{

$soap = new SoapClient($this->wsdl, $this->options());

$data = $soap->StockKeepingUnitComplementInsertUpdate($StockKeepingUnitComplement);

}

catch(Exception $e) {

echo "Erro! " .date("F j, Y, g:i a")." -> ".$e->getMessage();

}

sendo $StockKeepingUnitComplement esta arr:

Array

(

[StockKeepingUnitComplement] => Array

(

[StockKeepingUnitId] => 10514

[StockKeepingUnitComplement] => Array

(

[0] => 13223

[1] => 13226

[2] => 13365

)

[ComplementType] => 1

)

)

esse retorno:

Erro! October 8, 2018, 5:56 pm -> Value cannot be null. Parameter name: O objeto StockKeepingUnitComplement não pode ser nulo. |

Mas me manda o SOAP/XML mesmo, o que é gerado por essa chamada, o que você consegue ver pelo Fiddler4 / CharlesProxy, ai consigo ver o que realmente está sendo enviado e qual é o problema

Consegui resolver.. @Eduardo Gomes​ detectou um erro..

Os valores de ComplementType são: Accessory, Sugestion, Similarly or ShowTogether

Suggestion em inglês foi criado no método como Sugestion..

No php ao instanciar um new SOAP e utilizar o método "StockKeepingUnitComplementInsertUpdate" não funciona.

Foi necessário montar o XML e enviar via CURL desta forma:

while ($row = $resultado->fetch_array()){

$listaSugeridos = $listaSugeridos."<arr:int>".$row['codSugerido']."</arr:int>\n";

}

curl_setopt_array($curl, array(

CURLOPT_URL => "http://webservice-LOJA.AMBIENTE.com.br/Service.svc?wsdl=",

CURLOPT_RETURNTRANSFER => true,

CURLOPT_ENCODING => "",

CURLOPT_MAXREDIRS => 10,

CURLOPT_TIMEOUT => 30,

CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,

CURLOPT_CUSTOMREQUEST => "POST",

CURLOPT_POSTFIELDS => "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\" xmlns:vtex=\"http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts\" xmlns:arr=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">\n <soapenv:Header/>\n <soapenv:Body>\n <tem:StockKeepingUnitComplementInsertUpdate>\n <!--Optional:-->\n <tem:objStockKeepingUnitComplementDTO>\n <!--Optional:-->\n <vtex:ComplementType>Sugestion</vtex:ComplementType>\n <!--Optional:-->\n <vtex:StockKeepingUnitComplements>\n <!--Zero or more repetitions:-->\n ".$listaSugeridos." </vtex:StockKeepingUnitComplements>\n <!--Optional:-->\n <vtex:StockKeepingUnitId>".$codigo."</vtex:StockKeepingUnitId>\n </tem:objStockKeepingUnitComplementDTO>\n </tem:StockKeepingUnitComplementInsertUpdate>\n </soapenv:Body>\n</soapenv:Envelope> ",

CURLOPT_HTTPHEADER => array(

"authorization: Basic XXXXXXXXXXXXXXXXXXX",

"cache-control: no-cache",

"content-type: text/xml",

"postman-token: XXXXXXXXXXXXXXXX",

"soapaction: http://tempuri.org/IService/StockKeepingUnitComplementInsertUpdate"

),

));

$response = curl_exec($curl);

$err = curl_error($curl);

curl_close($curl);

if ($err) {

echo "cURL Error #:" . $err;

} else {

echo $response;

}

Mesmo erro, enviando com delphi...

Estou enviando esse soap

<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"> <SOAP-ENV:Body> <StockKeepingUnitComplementInsertUpdate xmlns="http://tempuri.org/"> <objStockKeepingUnitComplementDTO> <ComplementType xmlns="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts">ShowTogether</ComplementType> <StockKeepingUnitComplements xmlns="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts"> <int>77</int> <int>68</int> </StockKeepingUnitComplements> <StockKeepingUnitId xmlns="http://schemas.datacontract.org/2004/07/Vtex.Commerce.WebApps.AdminWcfService.Contracts">84</StockKeepingUnitId> </objStockKeepingUnitComplementDTO> </StockKeepingUnitComplementInsertUpdate> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

e recebendo isso

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <s:Fault> <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode> <faultstring xml:lang="pt-BR">A lista StockKeepingUnitComplements não pode ser nula.</faultstring> <detail> <ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <HelpLink i:nil="true"/> <InnerException i:nil="true"/> <Message>A lista StockKeepingUnitComplements não pode ser nula.</Message> <StackTrace> at Vtex.Commerce.WebApps.AdminWcfService.Service.StockKeepingUnitComplementInsertUpdate(StockKeepingUnitComplementDTO StockKeepingUnitComplement) in D:\pachamama\BuildAgent\work\67af720f163d9625\src\web applications\vtex.commerce.webapps.adminwcfservice\Service.svc.cs:line 665&#xD;'#$A' at SyncInvokeStockKeepingUnitComplementInsertUpdate(Object , Object[] , Object[] )&#xD;'#$A' at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)&#xD;'#$A' at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)&#xD;'#$A' at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)&#xD;'#$A' at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)&#xD;'#$A' at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) </StackTrace> <Type>System.Exception</Type> </ExceptionDetail> </detail> </s:Fault> </s:Body> </s:Envelope>

Alguém consegue ajudar?