PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Webservice mit NuSOAP: Request Probleme


rencarl
22.07.2009, 11:22:41
Hi,

seit einigen Tagen versuche ich einen bestimmten Request zu erstellen, aber irgendwo hakt es und ich komme einfach nicht weiter. Erschwerend kommt hinzu, dass ich noch keinerlei Erfahrung mit Webservices habe. Einen ersten einfachen eigenen Test-Webservice habe ich aber bereits einrichten können. Jetzt aber zum eigentlichen Webservice.

Die Anfrage (Request) muss wie folgt aussehen:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:v001="http://www.deltavista.com/dspone/ordercheck-if/V001">
<soapenv:Header>
<v001:messageContext>
<v001:credentials>
<v001:user>xxx</v001:user>
<v001:password>xxx</v001:password>
</v001:credentials>
</v001:messageContext>
</soapenv:Header>
<soapenv:Body>
<v001:orderCheckRequest>
<v001:product>
<v001:name>CreditCheckBusiness</v001:name>
<v001:country>DEU</v001:country>
</v001:product>
<v001:searchedCandidate>
<v001:legalForm>COMPANY</v001:legalForm>
<v001:address>
<v001:name>Deltavista</v001:name>
<v001:location>
<v001:street>Kaiserstrasse</v001:street>
<v001:house>217</v001:house>
<v001:city>Karlsruhe</v001:city>
<v001:zip>76133</v001:zip>
</v001:location>
</v001:address>
</v001:searchedCandidate>
</v001:orderCheckRequest>
</soapenv:Body>
</soapenv:Envelope>

Bisher habe ich folgende Anfrage hinbekommen:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
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"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns2449:hello xmlns:ns2449="http://tempuri.org">
<product>
<name xsi:type="xsd:string">QuickCheckBusiness</name>
<country xsi:type="xsd:string">DEU</country>
</product>
<searchedCandidate>
<name xsi:type="xsd:string">Deltavista</name>
<location>
<street xsi:type="xsd:string">Kaiserstrasse</street>
<house xsi:type="xsd:string">217</house>
<city xsi:type="xsd:string">Karlsruhe</city>
<zip xsi:type="xsd:string">76133</zip>
</location>
</searchedCandidate>
</ns2449:hello>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Wie bekomme ich jetzt z. B. den Header in die Anfrage hinein? Oder wie bekomme ich den korrekten Namespace (v001) hinzu?
------------------------------------------------------------------------------------------------------
Ausprobiert habe ich bisher folgendes:

// Pull in the NuSOAP code
require_once('nusoap-0.7.3/lib/nusoap.php');

// Create the client instance
$client = new nusoap_client('https://test-dspone.deltavista.com/dspone/services/OrderCheckService?wsdl',true);
$err = $client->getError();
if($err){
echo '<h2>Constructor error</h2><pre>'.$err.'</pre>';
}

$parameter = array(
'product' => array(
'name' => 'QuickCheckBusiness',
'country' => 'DEU'),
'searchedCandidate' => array(
'name' => 'Deltavista',
'location' => array(
'street' => 'Kaiserstrasse',
'house' => '217',
'city' => 'Karlsruhe',
'zip' => '76133')
)
);

$proxy = $client->getProxy();
$result = $proxy->orderCheck($parameter);

if($client->fault) {
print_r($result);
} else {
$err = $client->getError();
if ($err) {
echo '<h2>Error</h2><pre>'.$err.'</pre>';
} else {
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}

Entweder mach ich was falsch, oder die Test-Seite von deltavista funktioniert nicht. Auf jeden Fall erhalte ich ein leeres Resultat. $client->request und $client->response sind auch leer. Wenn ich meinen Test-Webservice 'http://localhost/webservices/server.php' verwende, kann ich mir wenigstens mit $client->request und $client->response XML-Code ausgeben lassen.

Desweiteren habe ich die Anfrage auch ohne Proxy ausgetestet:
$result = $client->call('orderCheck', $parameter);

Dies liefert mir aber eine Fehlermeldung, die ich nicht interpretieren kann:
wsdl error: http://www.deltavista.com/dspone/ordercheck-if/V001:orderCheckRequest^ (orderCheckRequest^) is not a supported type.

Ich vermute, dass die Parameterübergabe falsch ist, aber wie ist sie dann richtig? Wenn ich als $parameter einen einfachen String übergebe, erhalte ich folgende Fehlermeldung:
HTTP Error: Couldn't open socket connection to server http://10.50.1.21:8085/dspone/services/OrderCheckService, Error (110): Connection timed out

Damir
22.07.2009, 15:21:21
Hi,

also am einfachsten ist das mit PHP5. Hier kannst du direkt und bequem den Header et. setzen.

http://de.php.net/soap

Damir

rencarl
23.07.2009, 12:44:41
Hi, unser Provider hat dummerweise noch PHP 4.4.9. Aber das gute ist folgendes: unser Kunde wollte bei seinem eigenen Provider bleiben, und der hat PHP 5. Soso, PHP 5, habe ich keinerlei Erfahrung mit, aber egal, wir kommen der Lösung näher.

Ich habe jetzt folgenden Code:
// Create the client instance
$client = new SoapClient('https://test-dspone.deltavista.com/dspone/services/OrderCheckService?wsdl',array('trace'=>1));
var_dump($client->__getFunctions());
echo '<hr>';

$parameter = array(
'product' => array(
'name' => 'QuickCheckBusiness',
'country' => 'DEU'),
'searchedCandidate' => array(
'name' => 'Deltavista',
'location' => array(
'street' => 'Kaiserstrasse',
'house' => '217',
'city' => 'Karlsruhe',
'zip' => '76133')
)
);

$result = $client->__soapCall("orderCheck",$parameter);

if(is_soap_fault($result)) {
echo "FehlerCode: ", $result->faultcode, "\n";
echo "Beschreibung: ", $result->faultstring, "\n";
echo "Sender: ", $result->faultactor, "\n";
} else {
print_r($result);
}
echo "<hr>ANFRAGE:\n" . $client->__getLastRequest() . "\n";
echo "<hr>ANTWORT:\n" . $client->__getLastResponse() . "\n";

__getFunctions liefert mir folgende Ausgabe:
array(1) { [0]=> string(59) "OrderCheckResponse orderCheck(OrderCheckRequest $parameter)" }

Kann mir bitte jemand die Ausgabe erklären?

Außerdem erhalte ich folgende Fehlermeldung, vermutlich liegt es an der nicht korrekten Parameterübergabe:
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'product' property in...

DokuLeseHemmung
23.07.2009, 13:26:39
Hi, unser Provider hat dummerweise noch PHP 4.4.9.
Das riecht stark nach 1und1 !
Und da kannst du das bequem umstellen.

rencarl
23.07.2009, 16:07:03
Stimmt, einen guten Riecher hast du ;-)

Mit der Endung php5 funktioniert auch PHP 5 auf unserem Server, gut zu wissen.

Damir
27.07.2009, 12:56:08
Stimmt, einen guten Riecher hast du ;-)

Mit der Endung php5 funktioniert auch PHP 5 auf unserem Server, gut zu wissen.

und noch einfacher geht es mit einer .htaccess Datei, da du hier die Endung nicht auf PHP5 stellen musst.

rencarl
04.08.2009, 12:10:00
Zurück zum eigentlichen Thema:

Ich habe mittlerweile Login-Daten bekommen und eine Beispielanfrage, allerdings in Java
package com.deltavista.app.portal.soap.ordercheck.test;

import java.rmi.RemoteException;

import com.deltavista.app.portal.soap.ordercheck.ErrorMessage;
import com.deltavista.app.portal.soap.ordercheck.OrderCheckServiceStub;
import com.deltavista.app.portal.soap.ordercheck.stub.Address;
import com.deltavista.app.portal.soap.ordercheck.stub.Country;
import com.deltavista.app.portal.soap.ordercheck.stub.Credentials;
import com.deltavista.app.portal.soap.ordercheck.stub.LegalForm;
import com.deltavista.app.portal.soap.ordercheck.stub.Location;
import com.deltavista.app.portal.soap.ordercheck.stub.MessageContext;
import com.deltavista.app.portal.soap.ordercheck.stub.MessageContextE;
import com.deltavista.app.portal.soap.ordercheck.stub.OrderCheckRequest;
import com.deltavista.app.portal.soap.ordercheck.stub.OrderCheckRequestE;
import com.deltavista.app.portal.soap.ordercheck.stub.OrderCheckResponseE;
import com.deltavista.app.portal.soap.ordercheck.stub.Product;
import com.deltavista.app.portal.soap.ordercheck.stub.SearchCandidate;

/**
* Send test request
*
* German Team, (c) Deltavista 2000-2009
*/

public class ExampleRequest {

protected final static String host = "..."; //TODO set proper host here
protected final static String user="..."; //TODO set proper user login here
protected final static String password="..."; //TODO set proper user password here

protected void testB2BRequest() throws RemoteException, ErrorMessage {

Credentials credentials = new Credentials();
credentials.setUser(user);
credentials.setPassword(password);


MessageContextE context = new MessageContextE();
MessageContext ctx = new MessageContext();
ctx.setCredentials(credentials);
ctx.setCorrelationID("1234567890");
context.setMessageContext(ctx);


OrderCheckRequestE reqe = new OrderCheckRequestE();
Country country = new Country();
country.setCountry("DEU");

OrderCheckRequest req = new OrderCheckRequest();
Product product = new Product();
product.setName("CreditCheckBusiness");
product.setCountry(country);
req.setProduct(product);

SearchCandidate candidate = new SearchCandidate();
candidate.setLegalForm(LegalForm.COMPANY);


Address address = new Address();
address.setName("Deltavista");
Location[] locationArray = new Location[1];
Location location = new Location();
location.setType("CURRENT");
location.setCity("Karlsruhe");
location.setStreet("Keiserstr.");
location.setHouse("217");
location.setZip("76133");
Country candidateCountry = new Country();
candidateCountry.setCountry("DEU");
location.setCountry(candidateCountry);
locationArray[0] = location;
address.setLocation(locationArray);

candidate.setAddress(address);


req.setSearchedCandidate(candidate);
reqe.setOrderCheckRequest(req);


OrderCheckServiceStub stub = new OrderCheckServiceStub(host);
stub._getServiceClient().getOptions().setTimeOutInMilliSeconds(200000) ;
OrderCheckResponseE response;

response = null;
try {
response = stub.orderCheck(reqe, context);
} catch (RemoteException e) {
System.out.println("RemoteException: " + e + "\n" + e.getMessage());
throw e;
} catch (ErrorMessage e) {
System.out.println("ErrorMessage exception: " + e + "\n" + e.getMessage());
if (e.getFaultMessage() != null && e.getFaultMessage().getError() != null) {
System.out.println("Error code= " + e.getFaultMessage().getError().getCode() + ": " + e.getFaultMessage().getError().getMessageText());
}
throw e;
}
}

protected void testB2CRequest() throws RemoteException, ErrorMessage {

Credentials credentials = new Credentials();
credentials.setUser(user);
credentials.setPassword(password);

MessageContextE context = new MessageContextE();
MessageContext ctx = new MessageContext();
ctx.setCredentials(credentials);
ctx.setCorrelationID("1234567890");
context.setMessageContext(ctx);


OrderCheckRequestE reqe = new OrderCheckRequestE();
Country country = new Country();
country.setCountry("DEU");

OrderCheckRequest req = new OrderCheckRequest();
Product product = new Product();
product.setName("CreditCheckConsumer");
product.setCountry(country);
req.setProduct(product);

SearchCandidate candidate = new SearchCandidate();
candidate.setLegalForm(LegalForm.PERSON);

Address address = new Address();
address.setName("Max Mustermann");
Location[] locationArray = new Location[1];
Location location = new Location();
location.setType("CURRENT");
location.setCity("Musterstadt");
location.setStreet("Musterstraße");
location.setHouse("1");
location.setZip("12345");
Country candidateCountry = new Country();
candidateCountry.setCountry("DEU");
location.setCountry(candidateCountry);
locationArray[0] = location;
address.setLocation(locationArray);

candidate.setAddress(address);


req.setSearchedCandidate(candidate);
reqe.setOrderCheckRequest(req);


OrderCheckServiceStub stub = new OrderCheckServiceStub(host);
stub._getServiceClient().getOptions().setTimeOutInMilliSeconds(200000) ;
OrderCheckResponseE response;

response = null;
try {
response = stub.orderCheck(reqe, context);
} catch (RemoteException e) {
System.out.println("RemoteException: " + e + "\n" + e.getMessage());
throw e;
} catch (ErrorMessage e) {
System.out.println("ErrorMessage exception: " + e + "\n" + e.getMessage());
if (e.getFaultMessage() != null && e.getFaultMessage().getError() != null) {
System.out.println("Error code= " + e.getFaultMessage().getError().getCode() + ": " + e.getFaultMessage().getError().getMessageText());
}
throw e;
}
}

}

Mit Java kann ich nun überhaupt nix anfangen. Der Webservice wird doch aber mittels XML bewerkstelligt. Also müsste es doch möglich sein aus dem Java-Code den nötigen PHP-Code zu interpretieren. Das habe ich auch versucht:$client = new SOAPClient('https://online-de.deltavista.com/dspone/services/OrderCheckService?wsdl', array("user" => "MEINUSERNAME", "password" => "MEINPASSWORT"));

// Gibt eine Liste verfügbarer SOAP-Funktionen zurück
print_r($client->__getFunctions());
echo '<hr>';

// Gibt eine Liste der SOAP-Typen zurück
print_r($client->__getTypes());
echo '<hr>';

$parameter = array(
'product' => 'QuickCheckBusiness',
'company' => array(
'name' => 'Bau Clever GmbH',
'location' => array(
'street' => 'Rathaustraße',
'house' => '2',
'city' => 'Glücksburg',
'zip' => '24960')
)
);

$result = $client->__soapCall("orderCheck", $parameter);

if(is_soap_fault($result)) {
echo "FehlerCode: ", $result->faultcode, "\n";
echo "Beschreibung: ", $result->faultstring, "\n";
echo "Sender: ", $result->faultactor, "\n";
} else {
print_r($result);
}
echo "<hr>ANFRAGE:\n" .$client->__getLastRequest(). "\n";
echo "<hr>ANTWORT:\n" .$client->__getLastResponse(). "\n";

Als Ergebnis bekomme ich 'Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in ....'

Sorry, wenn ich alles mit Code zumülle, aber ich weiß echt nicht weiter.

Meine Testseite mit kompletter Ausgabe: http://www.teekontor-ostfriesland.de/client.php

rencarl
07.09.2009, 20:23:41
Hi,
Fehler gefunden. Es lag an der falschen URL.

Mit dem Tool soapUI kann man einfache Requests generieren. Und unter request properties musste ich nur den "Endpoint" ändern. Das hätten die mir aber auch früher sagen können ;-)