kSOAP2, Android i Allegro WebAPI

0

Próbuję napisać apkę na Androida, która będzie wykorzystywać ich WebAPI, które jest usługą SOAP. I mam kodzik (używający kSOAP1):

public final class AllegroSoapClient {
	private static final String API_NAMESPACE = "urn:AllegroWebApi";

	private static final String API_KEY = "KEY";
	private static final int LOCAL_VERSION = VERSION;
	private static final int COUNTRY_CODE = 228;

	private String sessionToken;

	private HttpTransportSE transport = new HttpTransportSE(
			"http://webapi.allegro.pl/uploader.php?wsdl");
	
	public AllegroSoapClient() {
		transport.debug = true;
	}

	/**
	 * Login to Allegro WebAPI
	 * @param username User login
	 * @param password User Password
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public void login(String username, String password) throws IOException,
			XmlPullParserException {
		SoapObject rpc =  new SoapObject(API_NAMESPACE, "doLogin");

		rpc.addProperty("user-login", username);
		rpc.addProperty("user-password", password);
		rpc.addProperty("country-code", COUNTRY_CODE);
		rpc.addProperty("webapi-key", API_KEY);
		rpc.addProperty("local-version", LOCAL_VERSION);

		sessionToken = sendRequest("doLogin", rpc).getPropertyAsString("session-handle-part");
	}
	
	/**
	 * Search for given string
	 * @param search
	 */
	public void search(String search) {
		SoapObject rpc = new SoapObject(API_NAMESPACE, "doSearch");
		
		rpc.addProperty("session-handle", sessionToken);
		
		SoapObject searchRequest = new SoapObject(API_NAMESPACE, "SearchOptType");
		searchRequest.addProperty("search-string", search);
		
		rpc.addProperty("search-query", searchRequest);
	}
	
	/**
	 * Get current user session token
	 * @return current session token
	 */
	public String getSessionToken() {
		return sessionToken;
	}
	
	private SoapObject sendRequest(String actionName, SoapObject rpc)
			throws IOException, XmlPullParserException {
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER12);
		envelope.dotNet = true;

		envelope.setOutputSoapObject(rpc);
		transport.call(actionName, envelope);
		
		return (SoapObject) envelope.getResponse();
	}
}

Jednak ciągle metoda transport.call(...) rzuca mi wyjątkiem org.xml.v1.XmlPullParserException: unexpected type.

1

Chyba masz actionName niewłaściwe, powinno być dla doLogin #login

0

Już rozwiązane. Głównym problemem było użycie nieszyfrowanego protokołu HTTP, ale problem już rozwiązany. Kod (sam klient, jeszcze będzie poprawiany i metody wywołujące zapytania zostaną wywalone do osobnych modeli):

/**
 * Class for easy connecting to Allegro WebAPI
 * 
 * @author Łukasz Niemier
 * 
 */
public final class Client {
	public static final String API_NAMESPACE = "urn:AllegroWebApi";
	public static final String API_KEY = "438ca7c534";
	public static final int COUNTRY_CODE = 1;

	private long localVersion;

	private String sessionToken;

	private HttpTransportSE transport = new HttpTransportSE(
			"https://webapi.allegro.pl/uploader.php");

	/**
	 * Login to Allegro WebAPI
	 * 
	 * @param username
	 *            User login
	 * @param password
	 *            User Password
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public String login(String username, String password) {
		SoapObject rpc = new SoapObject(API_NAMESPACE, "doLogin");

		rpc.addProperty("user-login", username);
		rpc.addProperty("user-password", password);
		rpc.addProperty("country-code", COUNTRY_CODE);
		rpc.addProperty("webapi-key", API_KEY);
		rpc.addProperty("local-version", localVersion);

		@SuppressWarnings("unchecked")
		Vector<Object> response = (Vector<Object>) sendRequest(rpc);
		return sessionToken = response.get(0).toString();
	}

	public Long actualizeLocalVersion() {
		SoapObject rpc = new SoapObject(API_NAMESPACE, "doQuerySysStatus");

		rpc.addProperty("sysvar", 1);
		rpc.addProperty("country-id", COUNTRY_CODE);
		rpc.addProperty("webapi-key", API_KEY);

		@SuppressWarnings("unchecked")
		Vector<Object> response = (Vector<Object>) sendRequest(rpc);
		return localVersion = Long.parseLong(response.get(1).toString());	
	}
	
	public Long getLocalVersion() {
		return localVersion;
	}

	/**
	 * Get current user session token
	 * 
	 * @return current session token
	 */
	public String getSessionToken() {
		return sessionToken;
	}

	public Object sendRequest(SoapObject rpc) {
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER11);
		envelope.dotNet = true;

		envelope.setOutputSoapObject(rpc);
		
		Object response = null;
		try {
			transport.debug = true;
			transport.call("", envelope);
			response = envelope.getResponse();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return response;
	}
}
0

Jak już jesteśmy w temacie ksoap2 i AllegroWebAPI - czy przekazywałeś już tablicę long[]?

0

Ale co jak i gdzie?

0

W paru requestach zachodzi potrzeba przekazania long[], więc pytałem trochę naokoło czy wiesz jak to zrobić w ksoap2, ale już chyba sobie poradziłem. :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1