因为项目里要用,所以才研究了一下,虽然对webservice和android都不怎么会,但是不管怎么说,研究出下面几个例子能满足需要了。这里调用方法的参数和返回值都是字符串,如果需要复杂对象参数,那看另外一篇博客《android调用webservice方法,参数或返回值使用服务器端类》
首先看服务器端提供的方法,这里就不看方法的实现了,看一下接口:
/**
* SERVICE_URL:http://192.168.1.101:8080/TestWsImplService/TestWsImpl
* SERVICE_NAMESCAPE:http://impl.webservices.yinke.com/
* 测试服务,包含两个方法,一个返回单个字符串,一个返回字符串数组
* @author Tsingheng
*/
@Local
@WebService
public interface TestWs {
/**
* 返回单个字符串测试方法
* @param testStr 字符串参数,将包含在返回结果中
* @return 返回单个字符串
*/
String test(String testStr);
/**
* 返回字符串数组测试方法
* @return 返回字符串数组
*/
String[] arrayTest();
}
这里有两个方法,方法介绍都有注释,我就不多说了。然后来看android的程序,这里需要使用ksoap2-android-assembly,百度一下可以找到很多下载,我的资源里也有,不需要积分的。把该Jar文件复制到项目根目录的libs目录下,如果没有就自己建,然后不需要做其他的什么操作了。下面看程序:
要调用服务器端的方法就需要网络通信,那就需要有网络权限,在AndroidManifest.xml中加入<uses-permission android:name="android.permission.INTERNET"/>
然后建个类保存webservice的相关常量信息
public class ServiceUtil {
public static final String SERVER_IP = "192.168.1.101:8080";
public static final String SERVICE_NS = "http://impl.webservice.yinke.com/";
public static final String TEST_SERVICE_URL = "http://" + SERVER_IP + "/TestWsImplService/TestWsImpl";
public static final String TEST_METHOD = "test";
public static final String ARRAY_TEST_METHOD = "arrayTest";
}
然后调用webservice方法是要用到SoapObject对象,我这里封装了几个方法,是让其他几个做客户端的同学用着方便,我在网上是没找到这么写的,我也还是个学生党,不知道这样做行不行,反正是测试没问题,别人用着也方便。如果同学们觉得好用可以用,如果有更好的方案还希望不吝赐教哦。
public class SoapUtil {
public static SoapObject buildSoapObject(String methodName) {
SoapObject soapObject = new SoapObject(ServiceUtil.SERVICE_NS,
methodName);
return soapObject;
}
private static SoapObject resultSoapObject(String serviceUrl,
SoapObject soapObject) throws IOException, XmlPullParserException {
HttpTransportSE ht = new HttpTransportSE(serviceUrl);
ht.debug = true;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = soapObject;
ht.call(null, envelope);
if (envelope.getResponse() != null) {
SoapObject resultSoapObject = (SoapObject) envelope.bodyIn;
return resultSoapObject;
}
return null;
}
public static String getResultString(String serviceUrl,
SoapObject soapObject) throws IOException, XmlPullParserException{
SoapObject resultSoapObject = resultSoapObject(serviceUrl, soapObject);
if (resultSoapObject != null) return String.valueOf(resultSoapObject.getProperty(0));
return null;
}
public static String[] getResultArray(String serviceUrl,
SoapObject soapObject) throws IOException, XmlPullParserException{
SoapObject resultSoapObject = resultSoapObject(serviceUrl, soapObject);
if (resultSoapObject != null){
String[] result = new String[resultSoapObject.getPropertyCount()];
for(int i = 0; i < resultSoapObject.getPropertyCount(); i++){
result[i] = String.valueOf(resultSoapObject.getProperty(i));
}
return result;
}
return null;
}
}
第一个方法是创建SoapObject对象,需要参数为调用的方法的名称,第二个方法是得到webservice方法的返回结果,需要的参数是服务的url和创建的soap对象,为了方便别人使用,就做了后面两个方法可以直接得到字符串值和字符串数组值。
然后看一下调用返回单个字符串的测试,让返回的字符串显示在activity的TextView上
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/testString"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" />
</LinearLayout>
public class MainActivity extends Activity {
private TextView testString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testString = (TextView) super.findViewById(R.id.testString);
try {
stringTest();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//测试调用getResultString方法,返回值为单个字符串。
private void stringTest() throws IOException, XmlPullParserException {
// 创建SoapObject对象
SoapObject stringSoapObject = SoapUtil
.buildSoapObject(ServiceUtil.TEST_METHOD);
//如果调用的方法需要参数,第一个参数使用arg0,arg1,...
stringSoapObject.addProperty("arg0", "我调用了返回单个字符串的方法!");
//stringSoapObject.addProperty("arg1", "value1");
testString.setText(SoapUtil.getResultString(ServiceUtil.TEST_SERVICE_URL, stringSoapObject));
}
}
然后看一下运行结果
然后测试一下返回字符串数组的,在界面上动态添加textView,来显示得到的结果
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</LinearLayout>
public class MainActivity extends Activity {
private LinearLayout linaerLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linaerLayout = (LinearLayout) super.findViewById(R.id.linearLayout);
LayoutParams leftlayoutlp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
try {
String[] resultTexts = arrayTest();
for(String text : resultTexts){
TextView textView = new TextView(this);
textView.setLayoutParams(leftlayoutlp);
textView.setText(text);
linaerLayout.addView(textView);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//测试调用getResultArray方法,返回值为字符串数组。
private String[] arrayTest() throws IOException, XmlPullParserException{
SoapObject arraySoapObject = SoapUtil
.buildSoapObject(ServiceUtil.ARRAY_TEST_METHOD);
String[] result = SoapUtil.getResultArray(ServiceUtil.TEST_SERVICE_URL, arraySoapObject);
return result;
}
}
结果
OVER,谢谢您的阅读。