Создание нового заказа в Magento с использованием KSOAP из Android

Я пытался использовать SOAP API Magento для создания нового заказа, так как REST API, похоже, не позволяет создавать новые заказы.

Я использую следующий код (в настоящее время он просто пытается войти в систему и получить идентификатор сеанса), но я продолжаю получать одну из следующих двух ошибок:

  • XMLPullParseException
  • SocketTimeoutException

Я использую библиотеку KSOAP2, чтобы сделать это, и следовал статье Inchoo, чтобы попытаться сделать это: http://inchoo.net/dev-talk/android-development/magento-v2-api-soap-android/ Я был REST человек всю мою жизнь, так что не понимаю, что происходит и где.

Кто-нибудь получил какие-либо указатели на любой рабочий пример и т. Д.?

    protected int login() {

        String NAMESPACE = "urn:Magento";
        String URL = "http://www.example.com/api/v2_soap/?wsdl";

        SharedPreferences sharedPref = getActivity().getSharedPreferences("tokens",
                getActivity().MODE_PRIVATE);

        SoapObject request = new SoapObject(NAMESPACE, "login");

        request.addProperty("username", sharedPref.getString("consumerKey", ""));
        request.addProperty("apiKey", sharedPref.getString("consumerSecret", ""));

        SoapSerializationEnvelope env = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        env.dotNet = false;
        env.xsd = SoapSerializationEnvelope.XSD;
        env.enc = SoapSerializationEnvelope.ENC;
        env.setOutputSoapObject(request);

        HttpTransportSE se = new HttpTransportSE(URL);
        se.debug = true;
        try {
            se.call("", env);
            Object result = env.getResponse();
            Log.d("MMD Order Response", result.toString());
        } catch (IOException e) {
            e.printStackTrace();
            log.d("Req: "+se.requestDump.toString());
            errorMessage = e.toString();
            return -1;
        } catch (XmlPullParserException e) {
            e.printStackTrace();
            errorMessage = e.toString();
            return -1;
        }
        return 1;
    }

Ошибка, которую я получаю:

java.net.SocketTimeoutException
java.net.PlainSocketImpl.read(PlainSocketImpl.java:491)
java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
java.io.InputStream.read(InputStream.java:163)
java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
java.io.BufferedInputStream.read(BufferedInputStream.java:227)
libcore.io.Streams.readAsciiLine(Streams.java:201)
libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:560)
libcore.net.http.HttpEngine.readResponse(HttpEngine.java:813)
libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
org.ksoap2.transport.ServiceConnectionSE.getResponseCode(ServiceConnectionSE.java:103)
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:197)
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
com.example.uifragments.Fragment_CartBasketView$CreateNewOrder.doInBackground(Fragment_CartBasketView.java:202)
com.example.uifragments.Fragment_CartBasketView$CreateNewOrder.doInBackground(Fragment_CartBasketView.java:145)
android.os.AsyncTask$2.call(AsyncTask.java:287)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
java.util.concurrent.FutureTask.run(FutureTask.java:137)
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
java.lang.Thread.run(Thread.java:856)

Другая ошибка, которую я получаю, заключается в следующем:

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html lang='en'>@2:17 in java.io.InputStreamReader@5381ee0c)
org.kxml2.io.KXmlParser.require(KXmlParser.java:2046)
org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:128)
org.ksoap2.transport.Transport.parseResponse(Transport.java:118)
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:275)
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
com.example.uifragments.Fragment_CartBasketView$CreateNewOrder.doInBackground(Fragment_CartBasketView.java:193)
com.example.uifragments.Fragment_CartBasketView$CreateNewOrder.doInBackground(Fragment_CartBasketView.java:145)
android.os.AsyncTask$2.call(AsyncTask.java:287)
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
java.util.concurrent.FutureTask.run(FutureTask.java:137)
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
java.lang.Thread.run(Thread.java:856)

Я попытался распечатать дамп ошибки, который говорит, что отправляется следующее

`<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"><v:Header /><v:Body><n0:login id="o0" c:root="1" xmlns:n0="urn:Magento"><username i:type="d:string">someusername</username><apiKey i:type="d:string">somePass</apiKey></n0:login></v:Body></v:Envelope>`

Любая помощь о том, где я скучаю?
Я зачесываю волосы и отлаживаю это с последних 5-6 дней! Большое спасибо заранее!

4 ответа

Решение

Это код, который я использую. Это прекрасно работает для меня.. Я думаю, что URL, который вы используете, может быть проблемой.

public void getMethod () {

    try {
        SoapObject request = new SoapObject(NAMESPACE, "login");

        request.addProperty("username", "xxxx");
        request.addProperty("apiKey", "xxxxx");

        SoapSerializationEnvelope env = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        env.dotNet = false;
        env.xsd = SoapSerializationEnvelope.XSD;
        env.enc = SoapSerializationEnvelope.ENC;

        env.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug=true;



        try {

            androidHttpTransport.call("", env);
            Object res = env.getResponse();
            ssid=res.toString();
            Log.v("sessionId", ssid);

        }catch (Exception e){
            ss=e.getMessage();
            Log.v("Soapfault",ss);
        }            

    } catch (Exception e) {

        Log.e("Error",e.toString());
    }

Пространство имен должно иметь конечный /,

Попробуйте изменить это на String NAMESPACE = "urn:Magento/";

Использование "http://www.example.com/api/v2_soap" вместо "http://www.example.com/api/v2_soap/?wsdl"

и использовать

*// int **timeout** = TimeOutValueInInteger* 

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, **timeout**);

вместо

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

Попробуйте заменить строковый URL = " http://www.example.com/api/v2_soap/?wsdl";

с

String URL = " http://www.example.com/api/v2_soap";

Другие вопросы по тегам