android通过ksoap2调用java语言写的部署在tomcat上的webservice

第一步: 要先发布自己写的webservice服务。
我是用java语言写的webservice服务。用的是eclipse软件和tomcat服务器。
配置tomcat服务器自己百度解决。
首先 File -> new -> Dynamic web Project 先建立一个名为my_server的web项目。
在这里插入图片描述
然后再src中建立一个包cn.jun,在包中建立三个java文件:WebService、WebServicePublish、WebServiceImpl。
在这里插入图片描述
其中代码如下:
WebService类中:

package cn.jun;
import javax.jws.WebMethod
@javax.jws.WebService
public interface WebService {
	@WebMethod
	String sayHello();
}

WebServiceImpl类中:

package cn.jun;

@javax.jws.WebService
public class WebServiceImpl implements WebService{
public String sayHello() {
	System.out.println("服务被调用");
	String aaa=name+"我是服务器程序";
	return aaa;
}

}

WebServicePublish类中:

package cn.jun;

import javax.xml.ws.Endpoint;

public class WebServicePublish {
public static void main(String[] args) {
	String address="http://你的ip:9050/WS_Server/WebService";  //此处你的ip改成你当前电脑的ip地址,可以通过cmd中用ipconfig/all查看自己电脑ipv4地址
	//9050是端口号,端口号可以任意值只要不冲突就行
	Endpoint.publish(address, new WebServiceImpl());
	System.out.println("发布webservice成功");
}
}

直接点击运行。
在这里插入图片描述
此时在浏览器中输入下面地址,后面要加上 ?wsdl
在这里插入图片描述
此时看到成功发布,记住下图中的圆圈里的内容,因为后面要用到。
在这里插入图片描述

但是上面步骤生成的webservice存在问题,就是当退出eclipse后,再重新进入eclipse后,之前在浏览器中查看的wsdl就不能查看了。可能的原因是当关闭了eclipse后,tomcat服务器也关闭了,所以发布在服务器上的werbservice服务就不能用了。此时你需要,重新发布webservice(就是重新运行WebservicPublish类,当控制台“输出发布webservice成功”)。

第二步 android通过ksoap2连接webservice服务
要下载下面ksoap2相关的jar包
相关网站有:
https://mvnrepository.com/在这里插入图片描述
首先打开android studio软件。 此处eclipse那个软件先不要关闭,否则出现上面问题
File ->new -> New project
在这里插入图片描述
选择Empty Activity 然后next
在这里插入图片描述
Name自定义 ,api版本选择:API 28:Android 9.0(pie) 。点击Finsh完成
在这里插入图片描述
(1)首先在AndroidManifest.xml文件中添加如下代码。

android:networkSecurityConfig="@xml/network_security_config"

<uses-permission android:name="android.permission.INTERNET" />

如图所示:
在这里插入图片描述
可以看到添加完第一条语句后有错误,此时右击res --> New --> Directory
在这里插入图片描述
名字必须命名为xml
在这里插入图片描述
然后右击新建的xml文件夹 --> New --> File
在这里插入图片描述
此处要与上面AndroidManifest.xml中的对应,所以必须命名为network_security_config.xml
在这里插入图片描述
然后添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

如图所示:然后之前的错误就没有了。
在这里插入图片描述

(2)在activity_main.xml中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/texta"
    android:layout_width="200dp"
    android:layout_height="50dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/textb"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:layout_marginTop="150dp"
    android:text="测试"/>

<EditText
    android:id="@+id/name"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:layout_marginTop="80dp"
    />

</RelativeLayout>

在这里插入图片描述
(3)在MainActivity中输入以下代码:

package cn.jun.ksoap2;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
/*
 *
 * ksoap2项目是调用用java写的webservice方法
 *
 *
 * */

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

public class MainActivity extends AppCompatActivity {
    private EditText phoneSecEditText;
    private TextView resultView;
    private Button queryButton;
    private String result;

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

    phoneSecEditText = (EditText) findViewById(R.id.name);
    resultView = (TextView) findViewById(R.id.texta);
    queryButton = (Button) findViewById(R.id.textb);

    queryButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String name = phoneSecEditText.getText().toString().trim();
            // 判断是否有输入
            if ("".equals(name)) {
                // 给出错误提示
                phoneSecEditText.setError("您输入的内容为空");
                phoneSecEditText.requestFocus();   //把输入焦点放在此控件
                // 将显示查询结果的TextView清空
                resultView.setText("");
                return;
            }

            //因为需要联网操作,android4.0版本后必须把联网操作放在子线程中,所以启动后台异步线程进行连接webService操作,并且根据返回结果在主线程中改变UI
            QueryAddressTask queryAddressTask = new QueryAddressTask();

            //启动后台任务
            queryAddressTask.execute(name);

        }
    });
}

class QueryAddressTask extends AsyncTask<String, Integer, String> {                //AsyncTask的作用是实现多线程、异步通信、消息传递
    @Override
    protected String doInBackground(String... params) {                      //接收输入参数,返回线程执行结果,系统自动调用
        // 返回的信息是*/
        try {
            result = getRemoteInfo(params[0]);

        } catch (Exception e) {
            e.printStackTrace();
        }
        //将结果返回给onPostExecute方法
        return result;
    }

    @Override
    //此方法可以在主线程改变UI
    protected void onPostExecute(String result) {                               //接收线程任务执行的结果
        // 将WebService返回的结果显示在TextView中
        resultView.setText(result);
    }
}


public String getRemoteInfo(String name) throws Exception{
    final String WSDL_URI = "http://ip:9050/WS_Server/WebService?wsdl";           //WSDL的URI,此处ip是:你发布wsdl的电脑的ipv4地址,由于是使用自己电脑发布的,所以ip就是自己电脑的ipv4地址
    String namespace = "http://jun.cn/";                                               //targetNamespace名称空间
    String methodName = "sayHello";                                                         //要调用的方法名称
    //以上值都可以从http://ip:9005/WebDemo.asmx?WSDL页面中查看到

    //第一步:实例化SoapObject 对象,指定webService的命名空间,以及调用方法名称
    SoapObject request = new SoapObject(namespace, methodName);

    //第二步:如果方法有参数的话,设置调用方法参,如果没有参数就不用设置。此处没用到参数,所以用//注释
    //        request.addProperty("name", name);  // request.addProperty("参数名称","参数值");

    //第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致)
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11);  //VER11表示soap的版本是soap11(之前在wsdl中看到的)
    envelope.bodyOut = request;        //由于是发送请求,所以是设置bodyOut
//  envelope.dotNet = true;            // 如果是.net开发的webservice,就要设置为true,此处是用java开发的,所以用//注释


    HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI);
    httpTransportSE.call(null, envelope);  //调用

    // 获取返回的数据
    SoapObject object = (SoapObject) envelope.bodyIn;
    // 获取返回的结果
    result = object.getProperty(0).toString();
    return result;

}
}

如下图所示有错误,是因为还没有导入ksoap2。
在这里插入图片描述
点击左上角的Android下标,选择project
在这里插入图片描述
在libs文件夹下将刚才下载的ksoap2包复制进去
在这里插入图片描述
然后右击jar包->Add as Library
在这里插入图片描述
然后就没有错误了。接下来运行程序。
在这里插入图片描述
注意: 因为工程是android 9.0,所以你要在模拟器为android 9.0版本上运行程序。
在这里插入图片描述
在这里插入图片描述
随便输入几个字母,点击测试,
在这里插入图片描述
问题: 可能直接就能运行并得到结果“我是服务器程序”。
也可能会出现问题,如图所示:点击下面的语句定位到错误。
在这里插入图片描述
在这里插入图片描述
此处的错误主要有两种原因:
第一种:可能是在(1)步有问题,因为Android 9.0系统已经默认不支持http请求了,谷歌默认要求链接是加密链接了,百度上有“android 9.0 http无法访问网络问题”的很多解决办法,自己百度。
第二种:可能是你的模拟器的移动网络和wifi关闭了
在这里插入图片描述
解决方法就是在模拟器中 设置 --> 网络和互联 --> 打开移动网络,或者wifi(注意: 模拟器的wifi有可能无法访问到互联网,所以你连的时候就会有时获取得到结果,有时获取不到)。所以推荐你只把模拟器的移动网络打开。

结果如下图所示:图中结果表示,调用了webservice服务的sayHello函数,并返回了“我是服务器程序“
在这里插入图片描述
此处问题:就是将软件打包成apk,放到我自己的手机上运行时就会出现错误,调用不了webservice的方法,没有返回值,具体原因不太知道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值