packagekandroid.keegan.com.theclient;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.widget.Button;importorg.ksoap2.SoapEnvelope;importorg.ksoap2.serialization.SoapObject;importorg.ksoap2.serialization.SoapSerializationEnvelope;importorg.ksoap2.transport.HttpTransportSE;importorg.xmlpull.v1.XmlPullParserException;importjava.io.IOException;public classMainActivity extendsActivity {
privateButton button;@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button= (Button)findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
testWebservice();printChenxinkuiString();}
});}
public voidtestWebservice(){
newThread(newRunnable() {
@Overridepublic voidrun() {
try{
String nameSpace = "http://service.hyan.com/";String methodName = "getValue";String actionName = nameSpace + methodName;//SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。//指定webservice的命名空间和调用的方法名SoapObject request = newSoapObject(nameSpace,methodName);//设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如下//要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致(我发现必须为“arg0,arg1”),只要设置参数的顺序一致即可。request.addProperty("arg0","chenxinkui");//生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述//创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。该版本号需要根据服务端WebService的版本号设置。在创建SoapSerializationEnvelope对象后,不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第一步创建的SoapObject对象SoapSerializationEnvelope envelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);envelope.dotNet= false;// envelope.bodyOut = request;envelope.setOutputSoapObject(request);// envelope.bodyOut = request;//创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URLHttpTransportSE ht =newHttpTransportSE("http://10.37.68.153:8080/TheService2/ServiceHello");//使用call方法调用WebService方法//Call方法的第一个参数一般为null,第2个参数就是在第3步创建的SoapSerializationEnvelope对象ht.call(actionName,envelope);//使用getResponse方法获得WebService方法的返回结果if(envelope.getResponse() != null){
/*** 打印服务端返回的结构*/Log.e("chenxinkui","服务端返回的结果是::"+envelope.getResponse().toString());// SoapObject result = (SoapObject) envelope.bodyIn;// String strResponse = result.getProperty("org0");}else{
Log.e("chenxinkui","envelope 为空");}
// SoapObject soapObject = ( SoapObject) envelope.getResponse();// Log.e("chenxinkui","soapObject:"+"adsfasdf");// Log.e("chenxinkui","soapObject:"+soapObject.toString());// SoapObject result = (SoapObject) envelope.bodyIn;// detail = (SoapObject) result// .getProperty("getWeatherbyCityNameResult");} catch(IOException e) {
Log.e("~~","e1:"+ e.toString());Log.e("~~","getMessage:"+ e.getMessage());e.printStackTrace();} catch(XmlPullParserException e) {
Log.e("~~","e2:"+ e.toString());e.printStackTrace();}
}
}).start();}
//这个是我第二个方法,实现代码基本一模一样,就加了一个参数,看懂上面那个方法就好了
public voidprintChenxinkuiString(){
newThread(newRunnable() {
@Overridepublic voidrun() {
try{
String nameSpace = "http://service.hyan.com/";String methodName = "printChenxinkuiString";String actionName = nameSpace + methodName;//SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。//指定webservice的命名空间和调用的方法名SoapObject request = newSoapObject(nameSpace,methodName);//设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如下//要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致(我发现必须为“arg0,arg1”),只要设置参数的顺序一致即可。request.addProperty("arg0","3");request.addProperty("arg1","5");//生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述//创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。该版本号需要根据服务端WebService的版本号设置。在创建SoapSerializationEnvelope对象后,不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第一步创建的SoapObject对象SoapSerializationEnvelope envelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);envelope.dotNet= false;// envelope.bodyOut = request;envelope.setOutputSoapObject(request);// envelope.bodyOut = request;//创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URLHttpTransportSE ht =newHttpTransportSE("http://10.37.68.153:8080/TheService2/ServiceHello");//使用call方法调用WebService方法//Call方法的第一个参数一般为null,第2个参数就是在第3步创建的SoapSerializationEnvelope对象ht.call(actionName,envelope);//使用getResponse方法获得WebService方法的返回结果if(envelope.getResponse() != null){
/*** 打印服务端返回的结构*/Log.e("chenxinkui","客户端传入的两个数,服务器相加结果为:"+envelope.getResponse().toString());// SoapObject result = (SoapObject) envelope.bodyIn;// String strResponse = result.getProperty("org0");}else{
Log.e("chenxinkui","envelope 为空");}
// SoapObject soapObject = ( SoapObject) envelope.getResponse();// Log.e("chenxinkui","soapObject:"+"adsfasdf");// Log.e("chenxinkui","soapObject:"+soapObject.toString());// SoapObject result = (SoapObject) envelope.bodyIn;// detail = (SoapObject) result// .getProperty("getWeatherbyCityNameResult");} catch(IOException e) {
Log.e("~~","e1:"+ e.toString());Log.e("~~","getMessage:"+ e.getMessage());e.printStackTrace();} catch(XmlPullParserException e) {
Log.e("~~","e2:"+ e.toString());e.printStackTrace();}
}
}).start();}
@Overridepublic booleanonCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main,menu);return true;}
@Overridepublic booleanonOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.intid = item.getItemId();//noinspection SimplifiableIfStatementif(id == R.id.action_settings) {
return true;}
return super.onOptionsItemSelected(item);}
}