# Java-Client für eBaySOAP-API liefert HTTP(400) Bad Request



## Bobby (11. Feb 2006)

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


----------



## Bobby (11. Feb 2006)

Hier noch ein paar zusätzliche Infos zum Error:

Stack Trace:

AxisFault
 faultCode: {http://xml.apache.org/axis/}HTTP
 faultSubcode: 
 faultString: (400)Bad Request
 faultActor: 
 faultNode: 
 faultDetail: 
	{}:return code:  400
&!DOCTYPE HTML PUBLIC &-//IETF//DTD HTML 2.0//EN&&
&HTML&&HEAD&
&TITLE&400 Bad Request&/TITLE&
&/HEAD&&BODY&
&H1&Bad Request&/H1&
Your browser sent a request that this server could not understand.&P&
The request line contained invalid characters following the protocol string.&P&
&P&
&HR&
&ADDRESS&Apache/1.3.27 Server at newsweek.sjc.ebay.com Port 8080&/ADDRESS&
&/BODY&&/HTML&

	{http://xml.apache.org/axis/}HttpErrorCode:400

(400)Bad Request
	at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:744)
	at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144)
	at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
	at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
	at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
	at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
	at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
	at org.apache.axis.client.Call.invoke(Call.java:2767)
	at org.apache.axis.client.Call.invoke(Call.java:2443)
	at org.apache.axis.client.Call.invoke(Call.java:2366)
	at org.apache.axis.client.Call.invoke(Call.java:1812)
	at com.ebay.webservices.soap.EBayAPISoapBindingStub.getSearchResults(EBayAPISoapBindingStub.java:8599)
	at cs.apps.webservices.clients.EbayBookSearch.main(EbayBookSearch.java:60)

Ich habe mittlerweile auch schon versucht, mit Code-Samples von der eBay Developer Site (also Code der richtig sein sollte) die eBay-SOAP API aufzurufen. Das Ergebnis ist immer das gleiche: (400)Bad Request

Wird langsam nervig...

Bobby


----------



## Bobby (13. Feb 2006)

Habe es mittlerweile geschafft, den SOAP-Request, den mein Java-Client bei der Ausführung an den eBay-SOAP API versendet, mit Hilfe des ParfumBall Network Sniffer Plugin anzuzeigen. Er lautet wie folgt:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<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:AppId>...</ns1:AppId>
				<ns1evId>...</ns1evId>
				<ns1:AuthCert>...</ns1:AuthCert>
			</ns1:Credentials>
		</ns1:RequesterCredentials>
	</soapenv:Header>
	<soapenv:Body>
		<GetSearchResultsRequest xmlns="urn:ebay:apis:eBLBaseComponents">
			<Version>443</Version>
			<ExternalProductID>
				<Value>1575211424</Value>
				<Type>ISBN</Type>
			</ExternalProductID>
		</GetSearchResultsRequest>
	</soapenv:Body>
</soapenv:Envelope>

Ich weiß nicht, was an diesem XML-Dokument den eBay Server dazu veranlasst, meinen Request nicht zu verstehen, mir erscheint es API-konform zu sein. Die Login-Daten der Elemente <eBayAuthToken>, <appId>, <devId>, <AuthCert> habe ich nochmals über das eBay API Test Tool ( http://developer.ebay.com/DevZone/build-test/test-tool.asp ) überprüft, das API Test Tool führt meine Anfragen problemlos aus. Weiss nicht, wo ich jetzt nach Fehlern suchen soll. 

Leute, ich brauche Tipps!

Carsten


----------

