热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ksoap2连接webservice

首先说说Ksoap2:Ksoap是Enhydra.org组织的一个开源作品,他是基于Enhydra.org出品的开源通用XML解析器KXML上进行开发的,2002年推出了Ksoap

首先说说Ksoap2:  

  Ksoap是Enhydra.org组织的一个开源作品,他是基于Enhydra.org出品的开源通用XML解析器KXML上进行开发的,2002年推出了Ksoap1.2版本,2003年推出了Ksoap2版本,Ksoap2提供了对soap序列化更好的支持。Ksoap2是一个轻量级的J2ME平台的实现框架,提供了soap协议消息的组装,网络post,网络return,解析等功能。

(下载地址:http://code.google.com/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/3.4.0/ksoap2-android-assembly-3.4.0-jar-with-dependencies.jar)可以把文件名去掉选择你想要的版本。

  等下会用到的的一些常用接口。

接口

SoapEnvelope

    对应于SOAP规范中的SOAP Envelope,封装了head和body对象。

SoapSerializationEnvelope

    SoapSerializationEnvelope是对SoapEnvelope的扩展,对SOAP序列化(Serialization)格式规范提供了支持,能够对简单对象自动进行序列化(simple object serialization)。

SoapObject

    SoapObject更方便地构造SOAP调用;

HttpTransport

    HttpTransport屏蔽了Internet访问/请求和获取服务器SOAP的细节。

 

 

再来说说:

   XFire是新一代的Java Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举。和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地和Spring集成,它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。

   但是, 他已经被CXF 所取代了,CXF继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。

  不过这里仍然用的时Xfire

 

好了,开始正题

  先新建一个web service project

  这里别忘了选择Xfire

 

 技术分享

  对于myeclipse没有Xfire的情况:

进入help->MyEclipse Configer Center ,点选Software选项卡,左侧有个Browse Software,点击导航右侧的 Add Site,弹出对话框,填入名称“XFire”(任填)和站点‘  http://dist.codehaus.org/xfire/update/  ‘, 在Browse Software下多了XFire的选项,双击选项,然后在Updates Aviables里面在单选框中打对勾,然后更新,会弹出更新向导,然后Next。。。

   然后  定义个接口

package hpu.lyl.filestore.services;

public interface IFileServices {
//保存文件
public void save(String fileName, String content) throws Exception; //读取文件 public String load(String fileName) throws Exception; }

   接着 实现接口

package hpu.lyl.filestore.services.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;

import hpu.lyl.filestore.services.IFileServices;

public class FileServicesImpl implements IFileServices{
    public String load(String fileName) throws Exception {
        File file = new File("D:" + File.separator + "android"
                + File.separator + fileName);
//判断文件是否存在
if(!file.exists()){ return null ; } StringBuffer buf = new StringBuffer() ; Scanner scan = new Scanner(new FileInputStream(file)) ; scan.useDelimiter("\n") ; while(scan.hasNext()){ buf.append(scan.next()) ; } scan.close(); return buf.toString() ; } public void save(String fileName, String content) throws Exception { File file = new File("D:" + File.separator + "android" + File.separator + fileName); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } PrintStream out = new PrintStream(new FileOutputStream(file)); out.print(content); out.close(); } }

然后 新建一个 web service

技术分享

 下一步

技术分享

 在下一步 填入你定义的接口和接口实现类 就行了

然后在 浏览器中输入:http://192.168.156.1/FilesProject/services/lyl?wsdl   如果可以看到描述信息 ,证明后台就布置好了。

这里在说说两句:

1、webservice

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

2、wsdl

网络服务描述语言是一个用来描述Web服务和说明如何与Web服务通信的XML(标准通用标记语言的子集)语言。为用户提供详细的接口说明书。

3、soap

简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

 

然后就是android端了

首先要导入 Xfire的jar包

选择工程右键properties

java build path

add External Jars:

技术分享

 

然后这里要特别注意一下:选择Order and Export  将导入的包打上对勾

不然就会这样的报错: java.lang.NoClassDefFoundError

因为jar包没有导进apk

 

 

package com.example.webserviceproject;

import java.io.IOException;

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 android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button save = null;
    private Button load = null;
    private TextView show = null;
    private static final String NAMESPACE = "http://192.168.156.1/";
    private static final String URL = "http://192.168.156.1/FilesProject/services/lyl";
    private static final String SAVE_METHOD_NAME = "save";
    private static final String LOAD_METHOD_NAME = "load";
    private static final String SOAP_ACTION = "http://192.168.156.1/FilesProject/services/";
    private Handler handle=new Handler(){
        public void handleMessage(android.os.Message msg) {
            if(msg.what==0){
                show.setText(msg.obj.toString());
            }
            if(msg.what==1){
                Toast.makeText(MainActivity.this, "数据保存成功", Toast.LENGTH_SHORT)
                .show();
            }
        }; 
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.save = (Button) super.findViewById(R.id.save);
        this.load = (Button) super.findViewById(R.id.load);
        this.show = (TextView) super.findViewById(R.id.show);
        this.save.setOnClickListener(new SaveOnClickListenerImpl());
        this.load.setOnClickListener(new LoadOnClickListenerImpl());

    }

    public class SaveOnClickListenerImpl implements OnClickListener {
        public void onClick(View v) {
            Thread thread = new Thread(null, saveInThread, "save");
            thread.start();
        }

    }

    public class LoadOnClickListenerImpl implements OnClickListener {
        public void onClick(View v) {
            Thread thread = new Thread(null, loadInThread, "load");
            thread.start();
        }

    }

    public Runnable saveInThread = new Runnable() {
        public void run() {
            
            SoapObject soapObject = new SoapObject(NAMESPACE, SAVE_METHOD_NAME);
            System.out.println("ssss");
            soapObject.addProperty("fileName", "lyl.txt");
            soapObject.addProperty("content", "ni hao wo shi ni da ye");
        
//            常量SoapEnvelope.VER10:对应于SOAP 1.0规范
//            常量SoapEnvelope.VER11:对应于SOAP 1.1规范 
//            常量SoapEnvelope.VER12:对应于SOAP 1.2规范
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
            envelope.bodyOut = soapObject;
            envelope.dotNet = false;
            envelope.setOutputSoapObject(soapObject);
            // 传输
//            HttpTransport是一个强大的辅助类,来完成Http-call
//            它封装了网络请求的一切,你完全不用考虑序列化消息。
//            HttpTransport仅仅负责把SoapEnvelope发送出去并接收响应
            HttpTransportSE trans = new HttpTransportSE(URL);
//            通过设置它的debug属性为true来打开调试信息。
            trans.debug = true; // 使用调试功能
            try {
//            可以发送请求给服务器、接收服务器响应并序列化SOAP消息
                trans.call(SOAP_ACTION, envelope);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            Message msg=handle.obtainMessage(1);
            msg.sendToTarget();
        }
    };


    public Runnable loadInThread = new Runnable() {
        public void run() {
            SoapObject soapObject = new SoapObject(NAMESPACE, LOAD_METHOD_NAME);
            soapObject.addProperty("fileName", "lyl.txt");
            SoapSerializationEnvelope soapSerializationEnvelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
            soapSerializationEnvelope.bodyOut=soapObject;
            soapSerializationEnvelope.dotNet=false;
            soapSerializationEnvelope.setOutputSoapObject(soapObject);
            HttpTransportSE trans=new HttpTransportSE(URL);
            trans.debug=true;
            try {
                trans.call(SOAP_ACTION, soapSerializationEnvelope);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            SoapObject result=(SoapObject)soapSerializationEnvelope.bodyIn;
            Message msg=handle.obtainMessage(0, result.getProperty(0));
            msg.sendToTarget();
            System.out.println("ddddddddddddddd");
        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.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();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

配置权限:

 

布局自己搞定。

 

 

 

ksoap2连接 web service


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
author-avatar
hK手机用户2927565637qq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有