+44(0) 1234 567 890 info@domainname.com

2012-11-30

Gọi Web Service từ ứng dụng Android sử dụng KSOAP

11:06:00

Share it Please


  • Vào File → New → Mục Android → Ta chọn Android Application Project

  • Đặt tên ứng dụng Android là KetQuaXoSoClient và tùy chỉnh như hình sau:

  • Chọn Next, và Next để tiến hành cấu hình Launcher Icon

  • Chọn Next

  • Đặt tên cho Activity
  • Chọn Finish
  • Trong res/layout/activity_main ta thiết kết 3 spinner và một listview để lấy kết quả về:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray" >

    <Spinner
        android:id="@+id/spDanhSachMien"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:prompt="@string/spinner_mien"
        android:spinnerMode="dropdown" />

    <Spinner
        android:id="@+id/spDanhSachTinh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/spDanhSachMien"
        android:prompt="@string/spinner_ngay"
        android:spinnerMode="dropdown" />

    <Spinner
        android:id="@+id/spDanhSachNgay"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/spDanhSachTinh"
        android:prompt="@string/spinner_tinh"
        android:spinnerMode="dropdown" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_below="@+id/spDanhSachNgay" >

        <ListView
            android:id="@+id/lvKetQua"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:scrollbars="vertical" >
        </ListView>
    </LinearLayout>

</RelativeLayout>
  • Trong res/value/string.xml tra khai báo như sau:
<resources>

     <string name="app_name">Kết quả sổ xố</string>
     <string name="hello_world">Hello world!</string>
     <string name="menu_settings">Settings</string>
     <string name="title_activity_main">Kết quả sổ xố</string>

     <string name="spinner_mien">Chọn miền</string>
     <string name="spinner_tinh">Chọn Tỉnh/Thành Phố</string>
     <string name="spinner_ngay">Chọn ngày xổ số</string>

</resources>
  • Trong AndroidManifest.xml ta khai báo quyền sử dụng Internet
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
     <uses-permission android:name="android.permission.INTERNET" />
     ...
</manifest>
  • Thêm thư viện ksoap đã download ở bước chuẩn bị trên vào libs

package hcmute.kqxs.client;

import java.io.IOException;
import java.util.ArrayList;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;

public class TienIch {
   private static String METHOD_NAME_1 = "getDanhSachMien";
   private static String METHOD_NAME_2 = "getDanhSachTinh";
   private static String METHOD_NAME_3 = "getDanhSachNgay";
   private static String METHOD_NAME_4 = "getDanhSachKetQua";

   private static String NAMESPACE = "http://kqsx.hcmute";
   private static String SOAP_ACTION_1 = NAMESPACE + METHOD_NAME_1;
   private static String SOAP_ACTION_2 = NAMESPACE + METHOD_NAME_2;
   private static String SOAP_ACTION_3 = NAMESPACE + METHOD_NAME_3;
   private static String SOAP_ACTION_4 = NAMESPACE + METHOD_NAME_4;

   private static final String URL = "http://192.168.42.108:8080/KetQuaXoSoServer/services/KetQuaXoSo?wsdl";

   public ArrayList<String> getDanhSachMien() {
        SoapObject resultSoap = null;
        try {
             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_1);
             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
             envelope.dotNet = true;
             envelope.setOutputSoapObject(request);
             HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

             androidHttpTransport.call(SOAP_ACTION_1, envelope);
             resultSoap = (SoapObject) envelope.bodyIn;// envelope.getResponse();
        } catch (IOException e) {
        } catch (XmlPullParserException e) {
        } catch (Exception e) {
        }

        ArrayList<String> result = new ArrayList<String>();
        for (int i = 0; i < resultSoap.getPropertyCount(); i++) {
             Log.i("ChuNT", resultSoap.getProperty(i).toString());
             result.add(resultSoap.getProperty(i).toString());
        }

        return result;
   }

   public ArrayList<String> getDanhSachTinh(String tenMien) {
        Log.i("ChuNT", "Hàm lấy danh sách đang tìm kết quả từ dịnh vụ web cho "
                   + tenMien);
        SoapObject resultSoap = null;
        try {
             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_2);
             request.addProperty("tenMien", tenMien);
             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
             envelope.dotNet = true;
             envelope.setOutputSoapObject(request);
             HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

             androidHttpTransport.call(SOAP_ACTION_2, envelope);
             resultSoap = (SoapObject) envelope.bodyIn;// envelope.getResponse();
        } catch (IOException e) {
        } catch (XmlPullParserException e) {
        } catch (Exception e) {
        }

        ArrayList<String> result = new ArrayList<String>();
        for (int i = 0; i < resultSoap.getPropertyCount(); i++) {
             Log.i("ChuNT", resultSoap.getProperty(i).toString());
             result.add(resultSoap.getProperty(i).toString());
        }

        return result;
   }

   public ArrayList<String> getDanhSachNgay(String tenMien, String tenTinh) {
        SoapObject resultSoap = null;
        try {
             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_3);
             request.addProperty("tenMien", tenMien);
             request.addProperty("tenTinh", tenTinh);
             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
             envelope.dotNet = true;
             envelope.setOutputSoapObject(request);
             HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

             androidHttpTransport.call(SOAP_ACTION_3, envelope);
             resultSoap = (SoapObject) envelope.bodyIn;// envelope.getResponse();
        } catch (IOException e) {
        } catch (XmlPullParserException e) {
        } catch (Exception e) {
        }

        ArrayList<String> result = new ArrayList<String>();
        for (int i = 0; i < resultSoap.getPropertyCount(); i++) {
             Log.i("ChuNT", resultSoap.getProperty(i).toString());
             result.add(resultSoap.getProperty(i).toString());
        }

        return result;
   }

   public ArrayList<String> getDanhSachKetQua(String tenMien,
             String tenTinh, String ngayXoSo) {
        SoapObject resultSoap = null;
        try {
             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_4);
             request.addProperty("tenMien", tenMien);
             request.addProperty("tenTinh", tenTinh);
             request.addProperty("ngayXoSo", ngayXoSo);
             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
              envelope.dotNet = true;
             envelope.setOutputSoapObject(request);
             HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

             androidHttpTransport.call(SOAP_ACTION_4, envelope);
             resultSoap = (SoapObject) envelope.bodyIn;// envelope.getResponse();
        } catch (IOException e) {
        } catch (XmlPullParserException e) {
        } catch (Exception e) {
        }

        ArrayList<String> result = new ArrayList<String>();
        for (int i = 0; i < resultSoap.getPropertyCount(); i++) {
             Log.i("ChuNT", resultSoap.getProperty(i).toString());
             result.add(resultSoap.getProperty(i).toString());
        }

        return result;
   }
}
  • String URL = "http://192.168.42.108:8080/KetQuaXoSoServer/services/KetQuaXoSo?wsdl";để lưu đường dẫn cung cấp dịch vụ web.
  • private String METHOD_NAME…Để lưu phương thức được cung cấp trong dịch vụ web 
  • private String NAMESPACE …Package và namespace được đảo ngược chuỗi
package hcmute.kqxs.client;

import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;

public class MainActivity extends Activity {

   Spinner spDanhSachMien;
   Spinner spDanhSachTinh;
   Spinner spDanhSachNgay;
   ListView lvKetQua;

   ArrayAdapter<String> arrayAdapterMien;
   ArrayAdapter<String> arrayAdapterTinh;
   ArrayAdapter<String> arrayAdapterNgay;
   ArrayAdapter<String> arrayAdapterKetQua;

   String tenMien;
   String tenTinh;
   String ngayXoSo;

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

        spDanhSachMien = (Spinner) findViewById(R.id.spDanhSachMien);
        spDanhSachTinh = (Spinner) findViewById(R.id.spDanhSachTinh);
        spDanhSachNgay = (Spinner) findViewById(R.id.spDanhSachNgay);
        lvKetQua = (ListView) findViewById(R.id.lvKetQua);

        arrayAdapterMien = new ArrayAdapter<String>(this,
                   android.R.layout.simple_spinner_item);
        arrayAdapterTinh = new ArrayAdapter<String>(this,
                   android.R.layout.simple_spinner_item);
        arrayAdapterNgay = new ArrayAdapter<String>(this,
                   android.R.layout.simple_spinner_item);
        arrayAdapterKetQua = new ArrayAdapter<String>(this,
                   android.R.layout.simple_list_item_1);

        spDanhSachMien.setAdapter(arrayAdapterMien);
        spDanhSachTinh.setAdapter(arrayAdapterTinh);
        spDanhSachNgay.setAdapter(arrayAdapterNgay);
        lvKetQua.setAdapter(arrayAdapterKetQua);

        arrayAdapterMien.add("Chọn miền xổ số");
        arrayAdapterTinh.add("Chọn tỉnh xổ số");
        arrayAdapterNgay.add("Chọn ngày xổ số");

        ArrayList<String> temp = new TienIch().getDanhSachMien();

        for (String string : temp) {
             arrayAdapterMien.add(string);
        }

        spDanhSachMien.setOnItemSelectedListener(spDanhSachMienSelected);
        spDanhSachTinh.setOnItemSelectedListener(spDanhSachTinhSelected);
        spDanhSachNgay.setOnItemSelectedListener(spDanhSachNgaySelected);
   }

   OnItemSelectedListener spDanhSachMienSelected = new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View arg1,
                   int position, long arg3) {
             tenMien = parent.getItemAtPosition(position).toString();
             Log.i("ChuNT", tenMien);
             ArrayList<String> temp = new TienIch().getDanhSachTinh(tenMien);
             spDanhSachTinh.setSelection(0);
             spDanhSachNgay.setSelection(0);
             arrayAdapterTinh.clear();
             arrayAdapterTinh.add("Chọn tỉnh xổ số");
             for (String string : temp) {
                   arrayAdapterTinh.add(string);
             }
        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }
   };

   OnItemSelectedListener spDanhSachTinhSelected = new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View arg1,
                   int position, long arg3) {
             tenTinh = parent.getItemAtPosition(position).toString();
             Log.i("ChuNT", tenTinh);
             ArrayList<String> temp = new TienIch().getDanhSachNgay(tenMien,
                        tenTinh);
             spDanhSachNgay.setSelection(0);
             arrayAdapterNgay.clear();
             arrayAdapterNgay.add("Chọn ngày xổ số");
             for (String string : temp) {
                   arrayAdapterNgay.add(string);
             }
        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }
   };

   OnItemSelectedListener spDanhSachNgaySelected = new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View arg1,
                   int position, long arg3) {
             ngayXoSo = parent.getItemAtPosition(position).toString();
             Log.i("ChuNT", ngayXoSo);
             ArrayList<String> temp = new TienIch().getDanhSachKetQua(tenMien,
                        tenTinh, ngayXoSo);
             arrayAdapterKetQua.clear();
             for (String string : temp) {
                   arrayAdapterKetQua.add(string);
             }
        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }
   };
}


Tổng kết

Như vậy qua phần này mình đã hướng dẫn các bạn cách  gọi một web service thông qua dịch vụ web dùng SOAP để trả kết quả về dạng XML. Ta dùng thư viện mã nguồn mở KSOAP để gọi web service đó. 

10 nhận xét:

  1. Em đang làm phần này nhưng bi lối, anh có thể giúp em sửa lôi được không à
    Code của em đây :
    package cong.org;

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


    public class MainActivity extends Activity {
    static final String SOAP_ACTION = "urn:WebServiceControllerwsdl#getMembers";
    private static final String METHOD_NAME = "getMembers";
    private static final String NAMESPACE = "urn:WebServiceControllerwsdl";
    private static final String URL = "http://berichmart.com.vn/service/webService/service";

    // ham getMembers tra ve 1 mang cac doi tuong member

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // goi soap

    try{
    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
    Request.addProperty("username", "admin");
    Request.addProperty("password", "admin");
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

    envelope.setOutputSoapObject(Request);

    HttpTransportSE aht = new HttpTransportSE (URL);
    aht.call(SOAP_ACTION, envelope); // chuong trinh bi loi nullpointer khi chay lenh này.
    SoapPrimitive resultstring = (SoapPrimitive) envelope.getResponse();

    Toast.makeText(getApplicationContext(), String.valueOf(resultstring).toString(), Toast.LENGTH_LONG).show();


    } catch(Exception E) {
    Toast.makeText(getApplicationContext(), "ERROR:" + E.getClass().getName().toString() + ": " + E.getMessage().toString(), Toast.LENGTH_LONG).show();

    }

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
    }

    }

    Trả lờiXóa
  2. e phải nói là lỗi j, ở đâu mới được chứ. cứ đưa code z sao a bik?

    Trả lờiXóa
  3. Anh cho em hỏi cái này với. Em có 1 phương thức tìm kiếm trong Webservice và gọi ra trong android. Khi em hiển thị kết quả ra TextView thì được. Sau đó em chuyển qua ListView thì lại bị lỗi. Đây là code chuyển ra Text
    try {
    SoapObject request = new SoapObject(NAMESPACE2,METHOD_NAME2);
    PropertyInfo pi = new PropertyInfo();
    pi.setName("a");
    pi.setValue(ma);
    pi.setType(String.class);
    request.addProperty(pi);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true; envelope.setOutputSoapObject(request);

    HttpTransportSE transport = new HttpTransportSE(URL);
    transport.call(SOAP_ACTION2, envelope);

    final Object response = envelope.getResponse();

    TextView tv = (TextView) findViewById(R.id.show);
    tv.setMovementMethod(new ScrollingMovementMethod());
    tv.setText(respone.toString());
    Còn đây là code hiển thị ra ListView:
    try {
    SoapObject request = new SoapObject(NAMESPACE2,METHOD_NAME2);
    PropertyInfo pi = new PropertyInfo();
    pi.setName("a");
    pi.setValue(ma);
    pi.setType(String.class);
    request.addProperty(pi);
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE transport = new HttpTransportSE(URL);
    transport.call(SOAP_ACTION2, envelope);
    final SoapObject response = (SoapObject)envelope.getResponse();
    try {
    JSONArray jsonArray= new JSONArray(response.toString());
    for (int i = 0; i < jsonArray.length(); i++) {
    array.add(newSuKien(jsonArray.getJSONObject(i).getString("tenSuKien"),jsonArray.getJSONObject(i).getString("ThoiGian1")));
    }
    } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    } catch (Exception e) {
    e.printStackTrace();
    }
    Anh xem giúp em với ạ. Em cám ơn

    Trả lờiXóa
  4. Cám ơn anh. Bài viết rất hay ạ. Tìm mãi trên mạng mới được bài viết này của anh :))
    Anh cho em hỏi nếu như mình muốn lấy hình ảnh hoặc video trên webservice sử dụng ksoap2 thì có lấy được không ạ. Muốn lấy được thì phải sửa code như thế nào ạ. Anh hướng dẫn cho em với ạ. Em cảm ơn anh rất nhiều ạ

    Trả lờiXóa
    Trả lời
    1. Cái này a chưa thử, vì thấy k nên làm z. Tuy nhiên, nếu em muốn thì có thể thử bằng cách chuyển image qua binary roi gửi.
      Chúc e thành công!

      Xóa
    2. Vâng ạ. Em cảm ơn anh ạ. Em mong anh có thật nhiều bài viết về Android ạ để bọn em có thể học theo ạ.

      Xóa
  5. Anh ơi cho em hỏi bây giờ mình muốn gửi một đối tượng từ Android bằng KSoap tới một Webservice viết bằng .NET thì mình làm thế nào ạ?
    :( Em đang làm đề tài tới đây thì bí mà hạn nộp sắp tới nơi rồi :(

    Trả lờiXóa
  6. anh ơi giúp em với em có đoạn code gọi webservice php :
    try {

    SoapObject soapclient = new SoapObject(NAMESPACE,METHOD_NAME);

    //SoapObject parameters = new SoapObject(NAMESPACE, METHOD_NAME);
    soapclient.addProperty("dv",21);
    //soapclient.addProperty(METHOD_NAME,parameters);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(soapclient);

    HttpTransportSE httpTransportSE = new HttpTransportSE(URL);

    httpTransportSE.call(SOAP_ACTION, envelope);
    SoapPrimitive res =(SoapPrimitive) envelope.getResponse();

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

    //strRespone = envelope.getResponse().toString();
    //Thread.currentThread().interrupt();
    tv.setText("a"+res.toString());
    //httpTransportSE.getConnection().disconnect();

    } catch (Exception e) {
    tv.setText(e.toString());

    }
    ..
    nhưng khí chạy nó báo lỗi : andoid.os.networkOnMainThreadException.
    Anh xem sửa giúp em với e tìm mấy hum nay mà chưa sửa đc! TKS anh

    Trả lờiXóa
  7. anh ơi,em làm y như thế này nhưng nó chạy lên màn hình trắng rồi dừng lun,ko load được,
    em có sữa 1 chô là chỗ spinnerMode em bỏ dòng này đi vì nó báo lỗi ko tìm thấy thuộc tính này trong gói android
    2 cái link
    http://kqsx.hcmute
    http://192.168.42.108:8080/KetQuaXoSoServer/services/KetQuaXoSo?wsdl
    em ko vào được nên nó có ảnh hưởng gì đến project ko anh

    Trả lờiXóa
  8. chào anh, em làm theo y như anh, web service đã hoạt động nhưng app android lại báo lỗi trong log cat, a giúp em fix với ạ:

    01-23 11:03:14.281: E/AndroidRuntime(2318): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int org.ksoap2.serialization.SoapObject.getPropertyCount()' on a null object reference

    Trả lờiXóa