Android開發教程 — Android調用WS

來源:互聯網
上載者:User

Hi,大家好!

    上節我們搭建了Java版的WS,那麼在Android用戶端上如何去訪問呢?這將是我們這節需要涉及到的知識點。

    照例,輕鬆一下:

     一個年輕的程式員和一個專案經理登上了一列在山裡行駛的火車,他們發現列車上幾乎都坐滿了,只有兩個在一起的空位,這個空位的對面是一個老奶奶和一 個年輕漂亮的姑娘。兩個上前坐了下來。程式員和那個姑娘他們比較曖昧地相互看對方。這時,火車進入山洞,車廂裡一片漆黑。此時,只聽見一個親嘴的聲音,隨 後就聽到一個響亮的巴掌聲。很快火車出了山洞,他們四個人都不說話。

那個老奶奶在喃喃道,“這個年輕小夥怎麼這麼無禮,不過我很高興我的孫女扇了一個巴掌”。

專案經理在想,“沒想到這個程式員居然這麼大膽,敢去親那姑娘,只可惜那姑娘打錯了人,居然給打了我。”

漂亮的姑娘想,“他親了我真好,希望我的祖母沒有打疼他”。

程式員坐在那裡露出了笑容,“生活真好啊。這一輩子能有幾次機會可以在親一個美女的同時打專案經理一巴掌啊”

   在Android中需要使用Ksoap2方式串連

   需要使用對應的jar包

   1 將ksoap2-android-assembly-2.4-jar-with-dependencies.jar 複製到項目中,並構建路徑(文章最後會上傳這個架包)

    調用核心代碼

public String GetUserWS(String methodName,String[] parameterList) {
// 建立SoapObject對象,並指定WebService的命名空間和調用的方法名
SoapObject request = new SoapObject(NAMESPACE, methodName);
// 調用的函數如果有參數,這裡可以設定需要傳遞的參數 注意:第一個參數使用arg0 多個參數依次類推 arg1,arg2...
if(parameterList != null)
{
for (int i = 0; i < parameterList.length; i++) {
request.addProperty("arg"+i, parameterList[i]);
}
}

// 產生調用WebService方法的SOAP請求資訊,並指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// envelope.setOutputSoapObject(request);
// 上邊的一句等價於下邊的這句 將SoapObject對象賦給envelope對象
envelope.bodyOut = request;
// 當前開發的是Java WS 這裡需要不調用.net WS
envelope.dotNet = false;
/*
* 這裡不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL);
* 這是一個要到期的類
* 建立HttpTransportSE對象。通過HttpTransportSE類的構造方法可以指定WebService的WSDL文檔的URL
*/
HttpTransportSE ht = new HttpTransportSE(SERVICEURL);
try {
// 請求WS
ht.call(null, envelope);
if (envelope.getResponse() != null) {
// 獲得WS函數傳回值資訊
System.out.println(envelope.getResponse().toString());
return envelope.getResponse().toString();
}

} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return null;
}

完整代碼如下:

package Jason.Test;

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

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

public class WSActivity extends Activity {
// 聲明WS的命名空間,命名空間在WSDL的頭部顯示
private static final String NAMESPACE = "http://Service.Jason.TSD/";
// 設定WS的路徑
private static String SERVICEURL = "http://192.168.1.110:8081/UserMgrService/UserInfoPort";
// 要調用的函數名稱
private static final String METHOD_NAME = "CalcFun";
private static final String METHOD_NAME1 = "GetUserName";
public static SoapObject soapObject;

Button btn1,btn2;
EditText edt1,edt2;
TextView txt1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button)findViewById(R.id.Btn1);
btn2 = (Button)findViewById(R.id.Btn2);
edt1 = (EditText)findViewById(R.id.edt1);
edt2 = (EditText)findViewById(R.id.edt2);
txt1 = (TextView)findViewById(R.id.txt1);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
txt1.setText("結果為:" + GetUserWS(METHOD_NAME1,null));
}
});

btn2.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
String[] parameterList = new String[2];
parameterList[0] = edt1.getText().toString();
parameterList[1] = edt2.getText().toString();
txt1.setText("結果為:" + GetUserWS(METHOD_NAME,parameterList));
}
});
}

public String GetUserWS(String methodName,String[] parameterList) {
// 建立SoapObject對象,並指定WebService的命名空間和調用的方法名
SoapObject request = new SoapObject(NAMESPACE, methodName);
// 調用的函數如果有參數,這裡可以設定需要傳遞的參數 注意:第一個參數使用arg0 多個參數依次類推 arg1,arg2...
if(parameterList != null)
{
for (int i = 0; i < parameterList.length; i++) {
request.addProperty("arg"+i, parameterList[i]);
}
}

// 產生調用WebService方法的SOAP請求資訊,並指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// envelope.setOutputSoapObject(request);
// 上邊的一句等價於下邊的這句 將SoapObject對象賦給envelope對象
envelope.bodyOut = request;
// 當前開發的是Java WS 這裡需要不調用.net WS
envelope.dotNet = false;
/*
* 這裡不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL);
* 這是一個要到期的類
* 建立HttpTransportSE對象。通過HttpTransportSE類的構造方法可以指定WebService的WSDL文檔的URL
*/
HttpTransportSE ht = new HttpTransportSE(SERVICEURL);
try {
// 請求WS
ht.call(null, envelope);
if (envelope.getResponse() != null) {
// 獲得WS函數傳回值資訊
System.out.println(envelope.getResponse().toString());
return envelope.getResponse().toString();
}

} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return null;
}
}

記得,需要先編寫服務端,並開啟服務,在使用用戶端進行調用。在進行資料傳遞時,可以使用Json資料類型,Java中使用JSONArray和JSONObject這兩個類就可以解析Json數組或Json對象。

代碼及架包以上傳至北京天聖達科技公司,歡迎大家下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.