Доступ к SOAP Webservics из Android - PullRequest
0 голосов
/ 06 января 2012

Я пытаюсь написать код Android для доступа к веб-сервису на основе SOAP.Но код нарушается при запросе SoapObject = новый SoapObject (NAMESPACE, METHOD) из-за исключения.

Код приведен ниже.Может кто-нибудь указать, что пошло не так.Любые приводит по этому вопросу приветствуется.Какие-нибудь фрагменты кода для того же доступны для любого из вас?

package com.demo;


import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import com.demo.R.id;

import java.net.*;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.TextView;


public class WebServiceDemoActivity extends Activity {


    private final String NAMESPACE = "http://tempuri.org";
    private final String URL = "http://xxxxx.com/xxx.svc?wsdl";
    private final String SOAPACTION = "http://tempuri.org/IServices/getSearchResults";
    private final String METHOD = "getSearchResults";



    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    }

    public void getPropertySearch(View v){

        TextView response_tv = (TextView)findViewById(id.ResultText);

        final TextView input_zip = (TextView)findViewById(id.ZipCode);
        String zip_value = input_zip.getText().toString();

        final TextView min_price = (TextView)findViewById(id.MinPrice);
        String min_value = input_zip.getText().toString();


        final TextView max_price = (TextView)findViewById(id.MaxPrice);
        String max_value = input_zip.getText().toString();


        if(zip_value == null || zip_value.length() == 0)
        {
            response_tv.setText("Error! Zip Code cannot be Empty");
            return;
        }

        if(min_value == null || min_value.length() == 0)
        {
            response_tv.setText("Error! Min: Price cannot be Empty");
            return;
        }

        if(max_value == null || max_value.length() == 0)
        {
            response_tv.setText("Error! Max: Price cannot be Empty");
            return;
        }


        SoapObject request = new SoapObject(NAMESPACE, METHOD);
        PropertyInfo GetSearchProp = new PropertyInfo();
        GetSearchProp.setName("getSearchResults");
        GetSearchProp.setValue("zip=19119,price>=1000000,price<=1099000");
        GetSearchProp.setType(String.class);
        request.addProperty(GetSearchProp);


        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try
        {

            System.out.print("Before SOAP call");

            androidHttpTransport.call(SOAPACTION, envelope);
            System.out.print("After SOAP call and getting Response");
            SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
            //response_tv.setText( "Value is "+ response.toString());

            System.out.println(response.toString());
            response_tv.setText( "SUCCESS");
        }catch(Exception e)
        {
            e.printStackTrace();
        }


    }
}

Ниже приведено исключение, которое я получаю.

01-06 12:06:09.477: W/System.err(535): android.os.NetworkOnMainThreadException
01-06 12:06:09.477: W/System.err(535):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
01-06 12:06:09.477: W/System.err(535):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
01-06 12:06:09.487: W/System.err(535):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
01-06 12:06:09.487: W/System.err(535):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
01-06 12:06:09.487: W/System.err(535):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
01-06 12:06:09.487: W/System.err(535):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
01-06 12:06:09.487: W/System.err(535):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
01-06 12:06:09.487: W/System.err(535):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
01-06 12:06:09.498: W/System.err(535):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
01-06 12:06:09.498: W/System.err(535):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
01-06 12:06:09.498: W/System.err(535):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
01-06 12:06:09.498: W/System.err(535):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
01-06 12:06:09.508: W/System.err(535):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
01-06 12:06:09.508: W/System.err(535):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
01-06 12:06:09.508: W/System.err(535):  at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:76)
01-06 12:06:09.508: W/System.err(535):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:152)
01-06 12:06:09.517: W/System.err(535):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
01-06 12:06:09.517: W/System.err(535):  at com.demo.WebServiceDemoActivity.getPropertySearch(WebServiceDemoActivity.java:91)
01-06 12:06:09.517: W/System.err(535):  at java.lang.reflect.Method.invokeNative(Native Method)
01-06 12:06:09.517: W/System.err(535):  at java.lang.reflect.Method.invoke(Method.java:511)
01-06 12:06:09.527: W/System.err(535):  at android.view.View$1.onClick(View.java:3039)
01-06 12:06:09.527: W/System.err(535):  at android.view.View.performClick(View.java:3511)
01-06 12:06:09.527: W/System.err(535):  at android.view.View$PerformClick.run(View.java:14105)
01-06 12:06:09.527: W/System.err(535):  at android.os.Handler.handleCallback(Handler.java:605)
01-06 12:06:09.538: W/System.err(535):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-06 12:06:09.538: W/System.err(535):  at android.os.Looper.loop(Looper.java:137)
01-06 12:06:09.538: W/System.err(535):  at android.app.ActivityThread.main(ActivityThread.java:4424)
01-06 12:06:09.547: W/System.err(535):  at java.lang.reflect.Method.invokeNative(Native Method)
01-06 12:06:09.547: W/System.err(535):  at java.lang.reflect.Method.invoke(Method.java:511)
01-06 12:06:09.547: W/System.err(535):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-06 12:06:09.547: W/System.err(535):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-06 12:06:09.547: W/System.err(535):  at dalvik.system.NativeStart.main(Native Method)

Ответы [ 2 ]

2 голосов
/ 11 октября 2012

Поскольку Strictmode включен Начиная с версии HoneyComb, вы не можете выполнять HTTP-запросы внутри основного потока. Вы должны запустить вторичный поток внутри основного и вызвать внутри него веб-сервис:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);       
    //...............
    new Thread(new Runnable()
    {
        public void run()
        {
            androidHttpTransport.call(SOAPACTION, envelope);
        }
    }).start();
}
0 голосов
/ 06 января 2012

По моему мнению, вы должны поменять мыло aCtion

private final String SOAPACTION = "http://tempuri.org/getSearchResults";

, потому что

SOAP ACTION=NAMESPACE+METHOD NAME

, попробуйте использовать это, может быть, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...