java webservice接口 - 如何在Android上调用SOAP Web服务




13 Answers

Android不提供任何类型的SOAP库。 你可以自己写,也可以使用kSOAP 2之类的东西。 正如你注意到的,其他人已经能够在他们自己的项目中编译和使用kSOAP2,但我不必这样做。

到目前为止,Google已经向向Android添加SOAP库的兴趣不大。 我怀疑这是因为他们宁愿支持Web服务当前趋向于基于REST的服务,并将JSON用作数据封装格式。 或者,使用XMPP进行消息传递。 但这只是猜测。

目前,基于XML的Web服务在Android上是一项稍微不重要的任务。 不知道NetBeans,我不能说说那里提供的工具,但我同意应该有一个更好的库。 XmlPullParser可能会让你免于使用SAX,但我对此不太了解。

soap调用 soap客户端

我很难找到有关如何使用Android调用标准SOAP / WSDL Web服务的良好信息。 我所能找到的都是非常复杂的文档和对“kSoap2”的引用,然后关于用SAX手动解析它的一些内容。 好吧,没关系,但是它是2008年的,所以我认为应该有一些用于调用标准Web服务的好库。

Web服务基本上是在NetBeans创建的。 我希望IDE支持生成管道类。 我只需要以最简单/最优雅的方式联系基于Android的手机的基于WSDL的Web服务。




确实,由于它的开销,SOAP并不是与移动设备进行数据交换的最佳选择。 但是,您可能发现自己处于不控制服务器输出格式的情况。

所以,如果你必须坚持使用SOAP,那么在这里为Android安装一个kSOAP2库:
http://code.google.com/p/ksoap2-android/




由于需要处理/解析开销,SOAP在Android(或通常的移动设备)上使用时不适用。 REST服务是一个更轻的解决方案,这就是我的建议。 Android带有一个SAX解析器,使用起来相当简单。 如果您绝对需要在移动设备上处理/解析SOAP,那么我为您感到难过,我所能提供的最佳建议就是不使用SOAP。




不要忘记在您的项目中添加ksoap2.jar,并在AndroidManifest文件中添加INTERNET权限

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 android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

    private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
    private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl"; 
    private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
    private static final String METHOD_NAME = "AuthenticateTest";
    private TextView lblResult;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lblResult = (TextView) findViewById(R.id.tv);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("name","44vmMAYrhjfhj66fhJN");
        request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);

            //SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            // SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;


            lblResult.setText(resultsRequestSOAP.toString());
            System.out.println("Response::"+resultsRequestSOAP.toString());


        } catch (Exception e) {
            System.out.println("Error"+e);
        }

    }
}



你可以看看WSClient++




如果可以的话,去JSON。 Android自带完整的org.json软件包










按照SOAP方法执行这些步骤

从WSDL文件中,

  • 为每个请求创建SOAP请求模板。

  • 然后将这些值替换为代码中传递的值。

  • 使用DefaultHttpClient实例将此数据发布到服务端点。

  • 获取响应流,最后

  • 使用XML Pull解析器解析响应流。




对我来说,最简单的方法是使用好的工具来生成所有需要的类。 我个人使用这个网站:

http://easywsdl.com/

它支持相当复杂的Web服务并使用kso​​ap2。




如果您在android中调用Web服务时遇到问题,那么您可以使用以下代码调用Web服务并获取响应。确保您的Web服务以数据表格式返回响应。如果您使用的数据来自SQL Server数据库。如果您使用MYSQL ,则需要更改一件事,只需从句子obj2=(SoapObject) obj1.getProperty("NewDataSet");替换单词NewDataSet obj2=(SoapObject) obj1.getProperty("NewDataSet");DocumentElement提供

void callWebService(){

private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name
private static final String URL = "http://localhost/sample/services/MyService?wsdl";
// you can use IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = "urn:" + METHOD_NAME;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("parm_name", prm_value);// Parameter for Method
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;// **If your Webservice in .net otherwise remove it**
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service
                                                                                                         // Method
    } catch (Exception e) {
        e.printStackTrace();
    }

    // Next task is to get Response and format that response
    SoapObject obj, obj1, obj2, obj3;
    obj = (SoapObject) envelope.getResponse();
    obj1 = (SoapObject) obj.getProperty("diffgram");
    obj2 = (SoapObject) obj1.getProperty("NewDataSet");

    for (int i = 0; i < obj2.getPropertyCount(); i++) { 
// the method getPropertyCount() and  return the number of rows
            obj3 = (SoapObject) obj2.getProperty(i);
            obj3.getProperty(0).toString();// value of column 1
            obj3.getProperty(1).toString();// value of column 2
            // like that you will get value from each column
        }
    }

如果您对此有任何疑问,请写信给我..




请下载并添加您的项目的SOAP库文件文件名: ksoap2-android-assembly-3.4.0-jar-with-dependencies

清理应用程序,然后启动程序

这是SOAP服务调用的代码

    String SOAP_ACTION = "YOUR_ACTION_NAME";
    String METHOD_NAME = "YOUR_METHOD_NAME";
    String NAMESPACE = "YOUR_NAME_SPACE";
    String URL = "YOUR_URL";
    SoapPrimitive resultString = null;

    try {
        SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
        addPropertyForSOAP(Request);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        soapEnvelope.dotNet = true;
        soapEnvelope.setOutputSoapObject(Request);

        HttpTransportSE transport = new HttpTransportSE(URL);

        transport.call(SOAP_ACTION, soapEnvelope);
        resultString = (SoapPrimitive) soapEnvelope.getResponse();

        Log.i("SOAP Result", "Result Celsius: " + resultString);
    } catch (Exception ex) {
        Log.e("SOAP Result", "Error: " + ex.getMessage());
    }
    if(resultString != null) {
        return resultString.toString();
    }
    else{
        return "error";
    }

结果可能是JSONObject或JSONArray或String

为了您更好的参考, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

谢谢。




您可以使用某些标题以http的形式执行soap调用。 我解决了这个问题,没有像ksoap2这样的附加库这里是从soap服务获取订单的实时代码

private static HashMap<String,String> mHeaders = new HashMap<>();

static {
    mHeaders.put("Accept-Encoding","gzip,deflate");
    mHeaders.put("Content-Type", "application/soap+xml");
    mHeaders.put("Host", "35.15.85.55:8080");
    mHeaders.put("Connection", "Keep-Alive");
    mHeaders.put("User-Agent","AndroidApp");
    mHeaders.put("Authorization","Basic Q2xpZW50NTkzMzppMjR3s2U="); // optional
}public final static InputStream receiveCurrentShipments(String stringUrlShipments)
{
    int status=0;
    String xmlstring= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ser=\"http://35.15.85.55:8080/ServiceTransfer\">\n" +
            "   <soap:Header/>\n" +
            "   <soap:Body>\n" +
            "      <ser:GetAllOrdersOfShipment>\n" +
            "         <ser:CodeOfBranch></ser:CodeOfBranch>\n" +
            "      </ser:GetAllOrdersOfShipment>\n" +
            "   </soap:Body>\n" +
            "</soap:Envelope>";
    StringBuffer chaine = new StringBuffer("");

    HttpURLConnection connection = null;
    try {
        URL url = new URL(stringUrlShipments);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Content-Length", xmlstring.getBytes().length + "");
        connection.setRequestProperty("SOAPAction", "http://35.15.85.55:8080/ServiceTransfer/GetAllOrdersOfShipment");

        for(Map.Entry<String, String> entry : mHeaders.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            connection.setRequestProperty(key,value);

        }

        connection.setRequestMethod("POST");
        connection.setDoInput(true);

        OutputStream outputStream = connection.getOutputStream();
        outputStream.write(xmlstring.getBytes("UTF-8"));
        outputStream.close();

        connection.connect();
        status = connection.getResponseCode();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        Log.i("HTTP Client", "HTTP status code : " + status);
    }

    InputStream inputStream = null;
    try {
        inputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return inputStream;
}



Related