Web Services: Java-Client für eBay-SOAP-API liefert HTTP(400) Bad Request
Hallo zusammen,
hat jemand Erfahrung mit der Nutzung der SOAP API von Ebay. Ich versuche nun schon seit Tagen, die Ebay-SOAP API mit meinem Java-Client anzusprechen, doch ich erhalte immer die gleiche Antwort:
(400)Bad Request
Your browser sent a request that this server could not understand.
The request line contained invalid characters following the protocol string.
Apache/1.3.27 Server at thrasher.sjc.ebay.com Port 8080;
Der Client hat folgenden Code:
public class EbayBookSearch {
private static String appId = "Dummy";
private static String devId = "Dummy";
private static String certId = "Dummy ";
private static String apiOperation = "GetSearchResults";
private static String apiVersion = "443";
private static String siteIdUS = "0";
private static String myToken = ?Dummy?
private static String parametersURL = new String("?callname=" + apiOperation + "&siteid="
+ siteIdUS + "&appid= " + appId + "&version=" + apiVersion + "&Routing=new");
private static String requestURL = endpointURL + parametersURL;
public static void main(String[] args) {
try {
EBayAPIInterfaceServiceLocator serviceLocator = new EBayAPIInterfaceServiceLocator();
EBayAPIInterface service = serviceLocator.geteBayAPI(new URL(requestURL));
EBayAPISoapBindingStub serviceClient = (EBayAPISoapBindingStub) service;
//Setting SOAP Header for Authentication
SOAPHeaderElement registrationData = new SOAPHeaderElement("urn:ebay:apis:eBLBaseComponents", "RequesterCredentials");
registrationData.setMustUnderstand(false);
registrationData.addChildElement("eBayAuthToken").addTextNode(myToken);
SOAPElement developerTokens = registrationData.addChildElement("Credentials");
developerTokens.addChildElement("AppId").addTextNode(appId);
developerTokens.addChildElement("DevId").addTextNode(devId);
developerTokens.addChildElement("AuthCert").addTextNode(certId);
serviceClient.setHeader(registrationData);
//Header-End
//Setting Call
GetSearchResultsRequestType bookSearchObject = new GetSearchResultsRequestType();
bookSearchObject.setVersion("443");
ExternalProductIDType isbnObject = new ExternalProductIDType();
isbnObject.setValue("1575211424");
isbnObject.setType(ExternalProductCodeType.ISBN);
bookSearchObject.setExternalProductID(isbnObject);
//Invoking Call
GetSearchResultsResponseType searchResponse = serviceClient.getSearchResults(bookSearchObject);
SearchResultItemType[] booksArray = searchResponse.getSearchResultItemArray();
for(int i =0; i < booksArray.length; i++) {
EbayBook bookInstance = new EbayBook();
bookInstance.setIsbn(booksArray[i].getItem().getExternalProductID());
bookInstance.setPrice(booksArray[i].getItem().getStartPrice());
}
}
catch (Exception e) {
System.out.println("");
System.out.println("Error occured! Message is: " + e.getMessage());
System.out.println("StackTrace is: ");
e.printStackTrace();
}
}
}
Die im Code verwendeten Java-Klassen (Interfaces, Stubs,...) habe ich aus der eBayAPI-WSDL mit Hilfe von Apache Axis 1.3 WSDL2Java generiert. Alternativ habe ich auch die Version Axis 1.1 ausprobiert. Kein Erfolg.
Ich vermute, dass der in SOAP codierte Request ein falsches Format aufweist, nur diesen anzuzeigen, ist mir nicht gelungen, da der SOAP Monitor (SOAP Spy von Systinet) anscheinend nur erfolgreiche Anfragen anzeigt. Lediglich den SOAP-Header konnte ich durch Anbindung an einen funktionierenden Amazon-Client anzeigen. Er hat folgende Form:
<soapenv:Header>
<ns1:RequesterCredentials
soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next"
soapenv:mustUnderstand="0" xmlns:ns1="urn:ebay:apis:eBLBaseComponents">
<ns1:eBayAuthToken>?</ns1:eBayAuthToken>
<ns1:Credentials>
<ns1:DevId>?</ns1:DevId>
<ns1:AppId>?</ns1:AppId>
<ns1:AuthCert>...</ns1:AuthCert>
</ns1:Credentials>
</ns1:RequesterCredentials>
</soapenv:Header>
Aber dieser ist zumindest konform zur API-Dokumentation (Vers. 443) und sollte daher nicht Ursprung des Übels sein. Für die Erstellung bzw. Ausführung des Clients verwende ich Elipse 3.1. Als JDK verwende Version 1.5 bzw. mit Version 1.4.2 habe ich es auch schon versucht. Kann mir jemand einen Tip geben, wo die Ursache liegen könnte. Mir wäre auch schon geholfen mit einen TCP/IP Monitor Tool, das auch bei erfolgloser Kommunikation den SOAP-Request anzeigt.
Besten Dank im Voraus.
Bobby