Xml 如何在androidstudio中使用soap调用服务而不使用ksoap

Xml 如何在androidstudio中使用soap调用服务而不使用ksoap,xml,android-studio,soap,wsdl,Xml,Android Studio,Soap,Wsdl,我在android studio上运行了以下代码: MainActivity.java package myname.company.com.soap\uu03; 导入android.net.Uri; 导入android.support.v7.app.AppActivity; 导入android.os.Bundle; 导入android.util.Log; 导入android.view.view; 导入android.widget.Button; 导入java.io.IOException; 导

我在android studio上运行了以下代码:

MainActivity.java

package myname.company.com.soap\uu03;
导入android.net.Uri;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.net.HttpURLConnection;
导入java.net.MalformedURLException;
导入java.net.ProtocolException;
导入java.net.URL;
导入java.util.HashMap;
导入java.util.Map;
公共类MainActivity扩展了AppCompatActivity{
私有静态HashMap mHeaders=newhashmap();
静止的{
put(“接受编码”、“gzip、deflate”);
put(“内容类型”、“应用程序/soap+xml”);
mHeaders.put(“主机”、“服务器:端口”);
mHeaders.put(“连接”、“保持活动”);
mHeaders.put(“用户代理”、“AndroidApp”);
//mHeaders.put(“授权”,“基本Q2XPZW50NTKZMPMJR3S2U=”);//可选
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
试一试{
按钮打开按钮=(按钮)findViewById(R.id.open);
openButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
试一试{
ReceiveCurrentShippings(“WSDL URL”);
}捕获(例外情况除外){
例如printStackTrace();
}
}
});
}捕获(例外e){
e、 printStackTrace();
}
}
公共最终静态InputStream ReceiveCurrentShippings(字符串StringUrlShippings){
int status=0;
字符串xmlstring=“”+
" "+
"

任何人都可以告诉我哪里出错了/而是提供一个工作示例


很高兴你问了这个问题,我在开始使用soap webservice时也遇到了同样的问题。这里的关键是避免使用soap库,而是使用java提供的类来发出请求并对其进行解析,即http、DOM解析器或SAX解析器。这就是在不使用ksoap或任何其他库的情况下发出请求的方式

现在转到Android代码:

我们将创建一个名为runTask的类,该类扩展了async task,并使用http发送请求正文并获取请求响应:

private class runTask extends AsyncTask<String, String, String> {

            private String response;
            String string = "your string parameter"
            String SOAP_ACTION = "your soap action here";

            String stringUrl = "http://your_url_here";
            //if you experience a problem with url remove the '?wsdl' ending



            @Override
            protected String doInBackground(String... params) {

                try {

                            //paste your request structure here as the String body.


                    String body = "<soapenv:Envelope xmlns:soapenv=\"http://someurl\" "+
            "xmlns:soap=\"someurl\" "+
            "xmlns:gen=\"http://someurl\"> "+
    "<soapenv:Header> "+
    "<auth:EventID xmlns:auth='http://someurl'>3000</auth:EventID> "+
    "</soapenv:Header> "+
    "<soapenv:Body> "+
    "<gen:getGenericResult> "+
    "<Request> "+
    "<dataItem> "+
    "<name>Username</name> "+
    "<type>String</type> "+
    "<value>usernamehere</value> "+
    "</dataItem> "+
    "<dataItem> "+
    "<name>Password</name> "+
    "<type>String</type> "+
    "<value>passwordhere</value> "+
    "</dataItem> "+
    "</Request> "+
    "</gen:getGenericResult> "+
    "</soapenv:Body> "+
    "</soapenv:Envelope>";


                    try {
                        URL url = new URL(stringUrl);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("POST");
                        conn.setDoOutput(true);
                        conn.setDefaultUseCaches(false);
                        conn.setRequestProperty("Accept", "text/xml");
                        conn.setRequestProperty("SOAPAction", SOAP_ACTION);
                        //you can pass all your request parameters here usong .setRequestProperty() method

                        //push the request to the server address

                        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                        wr.write(body);
                        wr.flush();

                        //get the server response

                        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        StringBuilder builder = new StringBuilder();
                        String line = null;

                        while ((line = reader.readLine()) != null) {


                            builder.append(line);
                            response = builder.toString();//this is the response, parse it in onPostExecute

                        }


                    } catch (Exception e) {

                        e.printStackTrace();
                    } finally {

                        try {

                            reader.close();
                        } catch (Exception e) {

                            e.printStackTrace();
                        }
                    }


                } catch (Exception e) {

                    e.printStackTrace();
                }

                return response;
            }

            /**
             * @see AsyncTask#onPostExecute(Object)
             */
            @Override
            protected void onPostExecute(String result) {



               try {

                  Toast.makeText(this,"Response "+ result,Toast.LENGTH_LONG).show();

                  //Go ahead and parse the response now

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
如果url和请求正文输入正确,您将在onPostExecute中获得响应,并从此处对其进行格式化和解析。
使用这种无库方式的主要优点是它非常灵活,与只使用提供的请求格式的库相比,您可以按照Web服务要求的任何方式格式化请求。此解决方案在我的代码中无缝工作,请随时询问任何进一步的说明。

我找到了解决方案。解决方案n是使用异步任务:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical"
    android:padding="16dp">



    <Button
        android:id="@+id/open"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@color/colorPrimaryDark"

        android:elevation="4dp"
        android:paddingLeft="70dp"
        android:paddingRight="70dp"
        android:text="Soap Call"
        android:textColor="#fff" />
</LinearLayout>
private class runTask extends AsyncTask<String, String, String> {

            private String response;
            String string = "your string parameter"
            String SOAP_ACTION = "your soap action here";

            String stringUrl = "http://your_url_here";
            //if you experience a problem with url remove the '?wsdl' ending



            @Override
            protected String doInBackground(String... params) {

                try {

                            //paste your request structure here as the String body.


                    String body = "<soapenv:Envelope xmlns:soapenv=\"http://someurl\" "+
            "xmlns:soap=\"someurl\" "+
            "xmlns:gen=\"http://someurl\"> "+
    "<soapenv:Header> "+
    "<auth:EventID xmlns:auth='http://someurl'>3000</auth:EventID> "+
    "</soapenv:Header> "+
    "<soapenv:Body> "+
    "<gen:getGenericResult> "+
    "<Request> "+
    "<dataItem> "+
    "<name>Username</name> "+
    "<type>String</type> "+
    "<value>usernamehere</value> "+
    "</dataItem> "+
    "<dataItem> "+
    "<name>Password</name> "+
    "<type>String</type> "+
    "<value>passwordhere</value> "+
    "</dataItem> "+
    "</Request> "+
    "</gen:getGenericResult> "+
    "</soapenv:Body> "+
    "</soapenv:Envelope>";


                    try {
                        URL url = new URL(stringUrl);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("POST");
                        conn.setDoOutput(true);
                        conn.setDefaultUseCaches(false);
                        conn.setRequestProperty("Accept", "text/xml");
                        conn.setRequestProperty("SOAPAction", SOAP_ACTION);
                        //you can pass all your request parameters here usong .setRequestProperty() method

                        //push the request to the server address

                        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                        wr.write(body);
                        wr.flush();

                        //get the server response

                        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        StringBuilder builder = new StringBuilder();
                        String line = null;

                        while ((line = reader.readLine()) != null) {


                            builder.append(line);
                            response = builder.toString();//this is the response, parse it in onPostExecute

                        }


                    } catch (Exception e) {

                        e.printStackTrace();
                    } finally {

                        try {

                            reader.close();
                        } catch (Exception e) {

                            e.printStackTrace();
                        }
                    }


                } catch (Exception e) {

                    e.printStackTrace();
                }

                return response;
            }

            /**
             * @see AsyncTask#onPostExecute(Object)
             */
            @Override
            protected void onPostExecute(String result) {



               try {

                  Toast.makeText(this,"Response "+ result,Toast.LENGTH_LONG).show();

                  //Go ahead and parse the response now

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
runTask task = new runTask();
task.execute();