javaweb 服务器 提供SOAP协议接口,android客户端调用代码实现过程

60 篇文章 0 订阅
35 篇文章 1 订阅
每次我自己在android端写webservice,或者rest接口的时候,都不知道后台做了啥,也不知道怎么就连接到了后台,因此,我就想知道后台到底怎么写的,我先写了个非常简单的Java web提供webservice接口,并且写了个android客户的测试,虽然写出来了,发现了解还不够深入,最少知道他是怎么回事,rerst的后面有时间在写一下看,如果写好了在补上
在写之前最好有点j2ee基础,这样上手快,我在学校稍微学了点,工作出来之后基本没碰过

1.首先需要有个可以创建javaweb工程的环境,我们开发android的eclipse是无法创建环境的,安装插件的话也可以,我这边有些开发java的兄弟,我偷个懒,自己找他们要了个工具(Eclipse Java EE IDE For Web Developers),大家可以去网上下载一个,哈哈哈
2.创建web工程
File》New》Dynamic web Project给工程取个名字(TheService)点击Finish。(我用这个工具创建工程不选择服务器的话好像跑不了,在创建的那个界面Target runtime 这一栏选择 Apache Tomcat v 7.0 ,如果无法选择,说明没配置tomcat服务器,不要着急,如果需要配置服务器,很简单,百度一下,eclipse配置tomcat)
3.工程创建好后
在SRC文件夹下面创建一个包com.hyan.service,包下面创建一个类ServiceHello
类的代码如下
    package com.hyan.service;


import javax.jws.WebService;

import javax.xml.ws.Endpoint;


@WebService

public class ServiceHello {


public String getValue(String name){

System.out.println("我叫:"+name);

return "我叫:"+name;

}

/**

* ¥´»Î ˝◊÷Œ“∏¯ƒ„º∆À„£¨π˛π˛π˛

* @return

*/

public int printChenxinkuiString(int numb1 ,int numb2){

System.out.println("两个数相加为:"+(numb1+numb2));

return numb1+numb2;

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Endpoint.publish("http://10.37.68.153:8080/TheService2/", new ServiceHello());

System.out.println("service success!");

}

}

4.写完代码后,右键》Run As 》Java Application 运行一下,如果控制台打印 service success,说明发布成功

5.接下来写可以在浏览器访问http://10.37.68.153:8080/TheService2/ServiceHello?wsdl  。ip是自己电脑的IP

如果发布成功,会看到如下代码


6.哈哈,发布成功了,soap接口就出来了,wsdl文件格式展示出来了,接下来我们写android代码,代码如下


package kandroid.keegan.com.theclient;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

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 java.io.IOException;


public class MainActivity extends Activity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                testWebservice();
                printChenxinkuiString();
            }
        });
    }

    public void testWebservice(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String nameSpace = "http://service.hyan.com/";
                    String methodName = "getValue";
                    String actionName = nameSpace + methodName;
                    //SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。
                    //指定webservice的命名空间和调用的方法名
                    SoapObject request = new SoapObject(nameSpace,methodName);
                    //设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如下
                    //要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致(我发现必须为“arg0,arg1”),只要设置参数的顺序一致即可。
                    request.addProperty("arg0","chenxinkui");
                    //生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述
                    //创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。该版本号需要根据服务端WebService的版本号设置。在创建SoapSerializationEnvelope对象后,不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第一步创建的SoapObject对象
                    SoapSerializationEnvelope envelope=new
                            SoapSerializationEnvelope(SoapEnvelope.VER11);

                    envelope.dotNet = false;
//                    envelope.bodyOut = request;
                    envelope.setOutputSoapObject(request);
//                  envelope.bodyOut = request;
                    //创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL
                    HttpTransportSE ht =new HttpTransportSE("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 void printChenxinkuiString(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String nameSpace = "http://service.hyan.com/";
                    String methodName = "printChenxinkuiString";
                    String actionName = nameSpace + methodName;
                    //SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。
                    //指定webservice的命名空间和调用的方法名
                    SoapObject request = new SoapObject(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=new
                            SoapSerializationEnvelope(SoapEnvelope.VER11);

                    envelope.dotNet = false;
//                    envelope.bodyOut = request;
                    envelope.setOutputSoapObject(request);
//                  envelope.bodyOut = request;
                    //创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL
                    HttpTransportSE ht =new HttpTransportSE("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();




    }
    @Override
    public boolean onCreateOptionsMenu(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;
    }

    @Override
    public boolean onOptionsItemSelected(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.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


结束,跑一下,客户端就可以输出服务器返回的参数了,哈哈,是不是很哈皮

写这文章就算给自己做了个小总结,希望能帮到大家,谢谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值