IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter访问webservice -> 正文阅读

[移动开发]Flutter访问webservice

首先要先了解一下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文件,也要按照特定的格式去解析这里我就不多加描述了。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:11:29  更:2021-08-14 14:12:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 1:05:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码