[PHP] Implementatie van SOAP

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sinds kort ben ik begonnen met een implementatie van SOAP in mijn website voor het ophalen van gegevens van een leverancier. Nu heb ik al enig onderzoek gedaan van hoe ik dit moet invoeren als code. Daarbij heb ik de onderstaande code gegenereerd, echter krijg ik de volgende error code van de server terug:

HTTP/1.1 405 Method Not Allowed

Ik heb de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?

require_once('lib/nusoap.php');
$klant= new nusoap_client("https://website/ws/external/partCatalog");
$antwoord = $klant->call("getSalesPartCatalog", array(
'sCustomerNo' => '*********',
'sInstance' => '*********',
'sSite' => '*********',
'sPassword' => '*********'
)); /* parameters als associatieve array meegeven */
if (!$fout=$klant->getError())
{
    print_r($antwoord);
}
else
{
    print("Fout : ".$fout);
}

echo '<h2>Response</h2><pre>' . htmlspecialchars($klant->response, ENT_QUOTES) . '</pre>';

?>


Daarbij kreeg ik de volgende envelope van de leverancier aangeleverd om te gebruiken voor het connectie maken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POST /ws/external/partCatalog/default.asmx HTTP/1.1
Host: website
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <AuthHeaderUser xmlns="https://website/ws/external/partCatalog">
      <sCustomerNo>string</sCustomerNo>
      <sInstance>string</sInstance>
      <sSite>string</sSite>
      <sPassword>string</sPassword>
    </AuthHeaderUser>
  </soap12:Header>
  <soap12:Body>
    <getSalesPartCatalog xmlns="https://website/ws/external/partCatalog" />
  </soap12:Body>
</soap12:Envelope>


Daarbij zou ik de volgende response moeten krijgen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getSalesPartCatalogResponse xmlns="https://website/ws/external/partCatalog">
      <getSalesPartCatalogResult>
        <SalesPart>
          <SalesPartID>int</SalesPartID>
          <SalesPartGUID>guid</SalesPartGUID>
          <PartID>int</PartID>
          <SalesPartNo>string</SalesPartNo>
          <CustomerSalesPartNo>string</CustomerSalesPartNo>
          <Site>string</Site>
          <Instance>string</Instance>
          <Description>string</Description>
          <PartNo>string</PartNo>
          <PurchasePartNo>string</PurchasePartNo>
          <EANCode>string</EANCode>
          <UnitCode>string</UnitCode>
          <CatalogType>string</CatalogType>
          <CatalogGroup>string</CatalogGroup>
          <Tax>double</Tax>
          <WeightGross>double</WeightGross>
          <WeightNet>double</WeightNet>
          <SalesOrderFlag>string</SalesOrderFlag>
          <Flag>int</Flag>
          <Taxable>boolean</Taxable>
          <CurrentlyOffer>boolean</CurrentlyOffer>
          <InventoryStandardPackage>int</InventoryStandardPackage>
          <InventoryVendorPartNo>string</InventoryVendorPartNo>
          <InventoryManufacturerPartNo>string</InventoryManufacturerPartNo>
          <InventoryTypeDesignationNo>string</InventoryTypeDesignationNo>
          <InventoryLevel>int</InventoryLevel>
          <ExpectedArrivalDate>dateTime</ExpectedArrivalDate>
          <UnitCostPrice>double</UnitCostPrice>
          <UnitListPrice>double</UnitListPrice>
          <UnitPrice>decimal</UnitPrice>
          <Pricelist>string</Pricelist>
          <Image>string</Image>
          <ModelCodeID>int</ModelCodeID>
          <DateCreated>dateTime</DateCreated>
          <RowVersion>dateTime</RowVersion>
        </SalesPart>
      </getSalesPartCatalogResult>
    </getSalesPartCatalogResponse>
  </soap12:Body>
</soap12:Envelope>

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 18:36

Ventieldopje

I'm not your pal, mate!

Even overleggen met je leverancier misschien? Het lijkt mij een rechten issue, kan zijn dat ze aan hun kant je account nog geen rechten hebben gegeven of dat je een parameter fout hebt.

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dus wat betreft syntax is dit volgens jou correct Phas0r?

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 10:21
Bekijk de request die wegstuurt eens, volgens mij sta je nu een request te doen met alle data in de body, terwijl het in de body hoort volgens de voorbeeld-request.

http://nl2.php.net/manual/en/soapclient.setsoapheaders.php
http://nl2.php.net/manual/en/class.soapheader.php

Je maakt dus een classmap met daarin een mapping voor "AuthHeaderUser", dat object vul je en geef je mee als SOAPHeader:
PHP:
1
2
3
$soap->setSoapHeaders (
  new SoapHeader( 'https://website/ws/external/partCatalog' , 'AuthHeaderUser' , new MyAuthHeaderUser() );
);

[ Voor 41% gewijzigd door wackmaniac op 27-01-2011 10:17 . Reden: extra uitleg ]

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah ja nu begrijp ik waarom hij inderdaad die errorcode geeft. De functie "__setSoapHeaders" werkt echter niet bij mij, krijg dan als melding dat deze method niet bestaat. Kan ik die functie niet samen met "new nusoap_client" gebruiken?

Acties:
  • 0 Henk 'm!

  • Camulos
  • Registratie: Januari 2009
  • Laatst online: 06-09 22:59

Camulos

Stampert

Dat is omdat jij Nusoap gebruikt en Wackmaniac de normale PHP-soap functionaliteit.

^^ voor normale SOAP messages kun je overigens gewoon the PHP-soap classes gebruiken (die wackmaniac noemt).. in plaats van nusoap .. (zelf geen goede ervaringen gehad met nusoap)

Not just an innocent bystander


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben nu aan de slag gegaan met SOAP. Ik krijg echter nog steeds errorcode 405:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
    
require("SOAP/Client.php");

$sc = new SOAP_Client("https://website/ws/external/partCatalog");

$headerbody = array(
'sCustomerNo'   => '******',
'sInstance'     => ''******',
'sSite'     => ''******',
'sPassword' => ''******'
); 

//Create Soap Header.        
$header = new SOAPHeader('https://website/ws/external/partCatalog', 'AuthHeaderUser', $headerbody);        
        
//set the Headers of Soap Client. 
$sc->__setSoapHeaders($header); 

$ret = $sc->call('getSalesPartCatalog',
                         array());
echo "<pre>";
print_r($ret);
echo "</pre>\n";

?>

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 10:21
Zoals ik al meldde in mijn eerste post; de header is een object. Je zult dus de AuthHeaderUser moeten mappen naar je eigen implementatie. Uit mijn hoofd:

PHP:
1
2
3
4
5
6
7
8
9
10
11
class MyAuthHeaderUser {
  public $sCustomerNo = 'XXXX';
  public $sInstance = 'XXXX';
  public $sSite = 'XXXX';
  public $sPassword = 'XXXX';
}

$soap = new SoapClient( $wsdl , array ( 'classmap' => array( 'AuthHeaderUser' => 'MyAuthHeaderUser' ) ) );
$soap->setSoapHeaders (
  new SoapHeader( 'https://website/ws/external/partCatalog' , 'AuthHeaderUser' , new MyAuthHeaderUser() );
);


Als je nu ook nog trace activeert, dan kan je met $soap->__getLastRequest() de volledige laatste envelop opvragen. Dan kan je zien wat er verstuurd wordt.

Read the code, write the code, be the code!

Pagina: 1