第一步: 要先发布自己写的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的方法,没有返回值,具体原因不太知道。