首先要先了解一下webservice(参照以下的链接内容) https://blog.csdn.net/u011199063/article/details/78550005
访问webservice
以下是我的服务端包结构 
服务端有个LoginService的类里面的getWareHouse方法其实就是我真正的想要去调用的方法。不用太研究,就是根据传入的参数进行了一个查询并返回的一个操作。

LoginService服务端发布之后,页面告诉我们测试访问的网址是 http://localhost:8080/FlutterService/services/LoginService 我的电脑的ip是192.168.1.21  去测试一下是否真的发布成功了,如图代表确实已经有了。  发布成功后在webconten下面一般有个wdsl文件的,我们找到对应的文件,里面其实就是一些信息。比如在这里我们知道targetNamespace是rd,比如有这个LoginService里面有几个方法啊,方法里面一般要什么参数啊之类的,其实是个类似于说明文档的东西。

但是我们的最终目的并不是这个外层的网址,而是如何去到里面的getWareHouse方法,并且将参数传递进去。 这时候我们要了解如何去访问,那么最上面的网址里面有详细的解释,这边就简单摘录一下-------首先必须是POST方法,而且要使用http发送XML格式的数据,数据的格式如下 Envelope:必须有,此元素将整个 XML 文档标识为一条SOAP消息 Header:可选元素,包含头部信息 Body:必须有,包含所有调用和响应信息 Fault:可选元素,提供有关在处理此消息时所发生的错误信息,以下是那位博主给出的例子,那么我们也仿照这个例子。

对于我的服务器而言我的XML应该长如下图所示: 为什么是rd:getWareHouse的标签 因为targetNamespace是rd,而要去调用的真正方法是getWareHouse。 也就是说,我们只要能够通过post方法将这个xml发送到对应的网址我们就能够成功与服务端通信了。 网址是什么?就是之前测试的时候的那个网址 http://192.168.1.21:8080/FlutterService/services/LoginService 
所以具体实现如下: 以下是在HttpUtil类里面写的静态方法,为了测试偷懒了现在参数写死的没有按照传入的写
import 'dart:io';
import 'package:app_flutter/common/global.dart';
import 'package:dio/dio.dart';
class HttpUtil{
static Future<String> doPostWithMap(String serviceName,Map<String, dynamic> param) async {
//实际如果访问 eg: http://192.168.1.201:8080/FlutterService/services/LoginService
try {
var url="http://"+Global.WEBSERVICE_IP+":"+Global.WEBSERVICE_PORT+"/"+Global.WEBSERVICE_FOLD+"/services/"+serviceName;
var headers={"SOAPAction": url,
"Content-Type": "text/xml;charset=UTF-8",
"cache-control": "no-cache"};
var body=creatEnvelope("getWareHouse");
print(url);
print(body);
Dio dio=new Dio(BaseOptions(headers: headers));//设置头
var response = await dio.post(url,data:body );//设置访问携带的信息
return response.data;
} catch (e) {
print(e);
return "";
}
}
//根据要访问的方法去创建一个信封
static String creatEnvelope(String methodName){
var envelope="<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">";//envelop标签
envelope=envelope+"<S:Body>";//body 必须有
envelope=envelope+"<"+Global.NAMESPACE+"\:"+methodName+" xmlns:"+Global.NAMESPACE+"\=\"http://jaxws.ws.itcast.cn/\">";//body 必须有
envelope=envelope+"<arg0>wpsadmin<\/arg0>"; //参数1 现在写死了
envelope=envelope+"<arg1>SUPER_MAN<\/arg1>";//参数2
envelope=envelope+"<\/rd:getWareHouse>";
envelope=envelope+"<\/S:Body>";
envelope=envelope+"<\/S:Envelope> ";
return envelope;
}
}
//全局变量
import 'package:shared_preferences/shared_preferences.dart';
class Global{
//实际如果访问 eg: http://192.168.1.201:8080/FlutterService/services/LoginService
static final String WEBSERVICE_IP="192.168.1.21";
static final String WEBSERVICE_PORT="8080";
static final String WEBSERVICE_FOLD="FlutterService";
static final String NAMESPACE="rd";
static final String LoginService="LoginService";
static late SharedPreferences _prefs;
static Future init() async{
_prefs=await SharedPreferences.getInstance();
}
}
调用
void _getWareHouse(String userId) async {
//获取查询结果
String jsonString =await HttpUtil.doPostWithMap(Global.LoginService,{"USER_ID":"wpsadmin","ROLE_ID":"SUPER_MAN"});
}
我们设置的url是http://192.168.1.201:8080/FlutterService/services/LoginService
我们通过代码创建的Envelope,输出的内容为了方便观察手动调整了下格式,确实如之前的图片一样的。
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<rd:getWareHouse xmlns:getWareHouse="http://jaxws.ws.itcast.cn/">
<arg0>username</arg0><arg1>SUPER_MAN</arg1>
</rd:getWareHouse>
</S:Body></S:Envelope>
那我们是否真的访问到了呢,由于我在服务端有进行输出所以看一下服务端有没有输出的记录,有记录说明真的访问到了。 
当然,访问完成获得的结果也是一个xml文件,也要按照特定的格式去解析这里我就不多加描述了。
|