PHP SoapClient isteği

2 Cevap php

I this WSDL kullanarak bir bülten servisine bir SOAP isteği göndermek için çalışıyorum.

İşte benim PHP bulunuyor:

$client = new SoapClient($wsdl_url, array(
    'login' => 'myusername',
    'password' => 'mypassword',
    'trace' => true
));

$client->AddSubscriber(
    new SoapParam('MyFirstName', 'FirstName'),
    new SoapParam('MyLastName', 'LastName'),
    new SoapParam('myemail@someaddress.com', 'Email')
);

Ben özel durum alıyorum:

End element 'Body' from namespace 'schemas.xmlsoap.org/soap/envelope/' expected. Found element 'LastName' from namespace ''. Line 2, position 156.

Burada hizmet AddSubscriber için bekliyor ne:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <AuthHeader xmlns="admin.ekeryx.com">
      <Username>string</Username>
      <Password>string</Password>
      <AccountID>string</AccountID>
    </AuthHeader>
  </soap:Header>
  <soap:Body>
    <AddSubscriber xmlns="admin.ekeryx.com">
      <subscriber>
        <ID>string</ID>
        <FirstName>string</FirstName>
        <LastName>string</LastName>
        <Email>string</Email>
      </subscriber>
      <overwritable>boolean</overwritable>
    </AddSubscriber>
  </soap:Body>
</soap:Envelope>

İşte gönderilen buydu:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="tempuri.org/">
    <SOAP-ENV:Body>
        <ns1:AddSubscriber/>
            <LastName>MyLastName</LastName>
            <Email>myemail@someaddress.com</Email>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ben SOAP ile çok bildik değilim, ve ben her yerde belgelerine arıyordum ettik, ama ben ne yapıyorum için çok iyi bir referans bulmak için görünmüyor olabilir.

Herhangi bir rehberlik çok duyacağız!


Teşekkürler. Bana bir örnek verebilir misiniz? Ben gösterir PHP sitede örnek bakıyorum:

<?php
class SOAPStruct {
    function SOAPStruct($s, $i, $f) 
    {
        $this->varString = $s;
        $this->varInt = $i;
        $this->varFloat = $f;
    }
}
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));
$struct = new SOAPStruct('arg', 34, 325.325);
$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPStruct", "http://soapinterop.org/xsd");
$client->echoStruct(new SoapParam($soapstruct, "inputStruct"));
?>

Eğer ben, bir abone PHP sınıf oluşturmak zorunda vb tüm değişkenler $this->FirstName = $first_name, atamak .. ve daha sonra kodlama ile bir SoapVar içinde vereceğini söyleyerek SOAP_ENC_OBJECT? Nasıl daha iyi abone yapısını temsil edebilir?

2 Cevap

İki olası Params abone ve overwriteable vardır

<soap:Body>
<AddSubscriber xmlns="admin.ekeryx.com">
  <subscriber>
    <ID>string</ID>
    <FirstName>string</FirstName>
    <LastName>string</LastName>
    <Email>string</Email>
  </subscriber>
  <overwritable>boolean</overwritable>
</AddSubscriber>

Yani subsrciber yapısını temsil etmek SoapVar kullanarak biraz daha karmaşık inşaat yapmak gerekir.

http://www.php.net/manual/en/soapvar.soapvar.php

Youll Sabun karşı XSD kontrol etmek istemesine rağmen, bence bu gibi görünmelidir: Vücut üretti ...

$subscriber = new StdClass();
$subscriber->ID = 'myid';
$subscriber->FirstName = 'First';
$subscriber->LastName = 'Last';

$subscriber = new SoapParam(new SoapVar($subscriber, SOAP_ENC_OBJECT, $type, $xsd), 'subscriber');

$ Tür API ve $ xsd XSD / WSDL defeinition de tip XSD için URI olmalıdır.

Ben bunu düşünüyorum ama Ive sadece (haha bir kabus oldu) EBay kez doğal PHP kütüphanelerini kullanılmış ve böylece biraz paslı im neredeyse 2 yıl önceydi.

Benzer bir cevap için kendimi bakarken bu geldi. Ben yaşadığınız sorun aşağıdaki kod HTTP başlığına değil SOAP başlık olarak giriş ve şifre geçeceğini inanıyorum

$client = new SoapClient($wsdl_url, array(
    'login' => 'myusername',
    'password' => 'mypassword',
    'trace' => true
));

Bu sizin için ne arıyorsanız olduğuna inanıyorum

$headerbody = array('Token' => $someToken, 
                    'Version' => $someVersion, 
                    'MerchantID'=>$someMerchantId, 
                      'UserCredentials'=>array('UserID'=>$UserID, 
                                             'Password'=>$Pwd));