Android studio 調用公司傳統的接口(跟傳統的稍有差別)附代碼

首先附上我在實現過程中參考的兩篇十分有用的文檔:
1.https://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html
2.https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/
工具準備:
OPPO k3 Android (9.0)手機,http://www.webxml.com.cn 天氣測試網站, Android studio 3.2開發環境

實現步驟:

  1. 建立Android工程 增加輸入,顯示框和按鈕
  2. 下載:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 包
  3. 把第二步下載的包拷貝到工程目錄app/libs 下
  4. 在Android studio 添加包到工程
  5. 編寫代碼調用公開的網絡天氣接口驗證工程代碼。
  6. 修改代碼調用公司後臺服務器接口。
    具體實現

1. 建立工程,輸入,顯示框和按鈕 滿足測試需要如圖:
在這裏插入圖片描述

2.下載soap包 https://download.csdn.net/download/zz_mm/3946373

3.複製到相應目錄如圖:
在這裏插入圖片描述

4.以添加第三方模塊的方式添加到工程如圖:
在這裏插入圖片描述
5.完成天氣網站可支持省份接口的調用:如圖
在這裏插入圖片描述
6.確認soap正常工作,更換公司內網,修改代碼調用公司後臺服務:(代碼跟Linux 端調用區別較大,具體參看工程代碼):如圖
在這裏插入圖片描述

package com.example.superman.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

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




public class MainActivity extends AppCompatActivity {

    String TAG = "Response";
    Button bt;
    EditText celcius;
    TextView txt;
    String getCel;
    SoapPrimitive resultString;

    //命名空間
    private static final String serviceNameSpace="http://tempuri.org/";
    String  xx="";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bt = (Button) findViewById(R.id.bt);
        celcius = (EditText) findViewById(R.id.cel);
        txt = (TextView) findViewById(R.id.txt);


        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                getCel = celcius.getText().toString();
                AsyncCallWS task = new AsyncCallWS();
                task.execute();
                txt.setText(xx);
               //calculate();
            }
        });
    }

    private class AsyncCallWS extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            Log.i(TAG, "onPreExecute");
        }

        @Override
        protected Void doInBackground(Void... params) {
            Log.i(TAG, "doInBackground");
            calculate();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Log.i(TAG, "onPostExecute");
//            Toast.makeText(MainActivity.this, "Response" + resultString.toString(), Toast.LENGTH_LONG).show();
        }

    }

    public void calculate() {
        String serviceURL="http://10.0.5.47:9080/TmriOutAccess.svc?singleWsdl";
        String getSupportCity="getSupportCity";
        String getSupportProvince="getSupportProvince";
        String query="queryObjectOut";
        String para = "<?xml version=\"1.0\" encoding=\"gb2312\"?> <root> <QueryCondition> 	<SN>123456</SN> </QueryCondition></root> ";

        try {
            //SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
            ///Request.addProperty("Celsius", getCel);
            SoapObject soapObject = new SoapObject("http://tempuri.org/", query);
            soapObject.addProperty("xtlb","17");
            soapObject.addProperty("jkxlh","17J01");
            soapObject.addProperty("jkid","17J01");
            soapObject.addProperty("xmlDoc",para);

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

            HttpTransportSE transport = new HttpTransportSE(serviceURL);
            transport.debug=true;
            transport.call("http://tempuri.org/ITmriOutAccess/queryObjectOut", soapEnvelope);
            Object result = (Object) soapEnvelope.getResponse();
           Log.i(TAG, "Result Celsius: " + result);
           xx = result.toString();
        } catch (Exception ex) {
            Log.e(TAG, "Error: " + ex.getMessage());
        }
    }
}


上面就是測試的簡單程序,如果做過linux 下的soap 調用應該會熟悉一些,在Android下不需要引用獲得文件,這是比較大的區別。
再一個就是演示 namespace 的確定和 參數的添加(soapObjetc.addProperty的使用),我也在這裏來回實驗,debug 根據錯誤信息修改代碼和相應的參數才試出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章