Webservice的发布以及调用的几种方式

JAX-WS jdk创建

1.服务端发布

使用jdk自带的注解的方式创建webservice,仅通过最简单的几个注解就可以实现,本实例展示图片的传输以及文本,图片以及文件的传输使用DataHandle类,示例jdk 1.8

package webservice;

import javax.activation.DataHandler;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
import java.io.*;

/**
 * webservice demo
 */
@WebService
public class WebserviceForFile {

    /**
     * 文件上传
     *
     * @WebResult一定要加上,开始没加一直报错
     *
     * @param dataHandler   文件数据
     * @param fileName      文件名称    image.jpg
     */
    @WebMethod
    public @WebResult void uploadFile(@WebParam(name="dataHandle") DataHandler dataHandler, @WebParam(name="fileName") String fileName){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            /*标准的文件输入输出*/
            InputStream inputStream = dataHandler.getInputStream();
            bis = new BufferedInputStream(inputStream);
            File file = new File("F:\\Temp\\" + fileName);
            bos = new BufferedOutputStream(new FileOutputStream(file));
            byte[] bytes = new byte[1024];
            int len = 0;
            while((len = bis.read(bytes)) > 0){
                bos.write(bytes, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(bis != null){
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bos != null){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 发布
     * @param args
     */
    public static void main(String[] args) {
        Endpoint.publish("http://ip:8888/uploadFile", new WebserviceForFile());
    }
}

2.客户端调用

在jdk安装目录的bin目录下打开命令行窗口(可以打开bin目录,然后在地址栏输入cmd回车,就会在当前目录下打开命令行窗口)

wsimport -keep -d E:\workspace\meetingForDebug\src http://ip:8888/uploadFile?wsdl

按回车键dos窗口会输出生成的日志,找到存放生成代码的位置,将其拷贝到项目中.在生成的代码中有两个*Service.java的类,其中一个是接口一个是实现类,在实现类中可以看到有@WebServiceClient注解,该类中找到有@WebEndpoint标记的方法,选择其中一个空参数的方法。所以使用时就用该类对象获取该方法然后就可以调用需要的接口了

package cn.com.xu.Test.ClassExtends;

import webservice.WebserviceForFileService;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class Demo {
    public static void main(String[] args) {
        try {
            //将图片转化为字节数组
            byte[] bytes = Files.readAllBytes(new File("F:\\Temp\\shuimu.jpg").toPath());
            WebserviceForFileService service = new WebserviceForFileService();
            //@WebServiceClient标记的类, @WebEndpoint标记的方法
            service.getWebserviceForFilePort().uploadFile(bytes, "copyShuimu.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("success");
    }
}

3.注意事项

a.示例中通过main方法发布webservice,实际项目中可以在Servlet的初始化方法中发布

b.使用该种方式发布的端口要和原来的tomcat端口不一样,否则会被占用,且每次发版都要重启tomcat

c.实际使用中测试的地址和生产的地址是不一样的,在没有更新服务端代码的前提下,发布到生产环境,只需要更改上文中的WebserviceForFileService类中的两个出地址即可。

缺点:不能动态更新服务端代码,地址更换较其他方式不方便

ps:还有发布的时候一直没有找到好的方法,后续有将补充

4.客户端使用字符串声明

即服务端不在声明DataHandle类型的数据,使用字符串,下面示例展示使用BASE64Encoder、BASE64Decoder处理

package webservice;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.*;

public class FileToBytes {

    /**
     * 客户端处理,通过BASE64Encoder将图片转化为字符串
     * @param filePath
     * @return
     */
    public String clientHandle(String filePath) {
        String imageData = "";
        BufferedInputStream bis = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        BASE64Encoder encoder = new BASE64Encoder();
        try {
            bis = new BufferedInputStream(new FileInputStream(new File(filePath)));
            byte[] bytes = new byte[1024];
            int len = 0;
            while((len = bis.read(bytes)) > 0){
                bos.write(bytes, 0, len);
            }
            byte[] byteArray = bos.toByteArray();
            imageData = encoder.encode(bytes);
        } catch (IOException e){
            e.printStackTrace();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return imageData;
    }

    /**
     * 服务端处理,通过BASE64Decoder将String转化为图片
     * @param imageData 保存的文件路径
     * @param filePath  文件数据
     */
    public void serviceHandle(String imageData, String filePath){
        BufferedOutputStream bos = null;
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] buffer = decoder.decodeBuffer(imageData);
            bos = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
            bos.write(buffer);
            bos.flush();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(bos != null){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

eclipse创建

使用Axis2创建

前言:本示例中使用的Axis2版本为1.4.1,eclipse版本Indigo Service Release 2,其他版本情况可能不同,下面会提到。

2.1.下载Axis2插件Axis2_Codegen_Wizard_1.4.0:https://download.csdn.net/download/wangruowen007/9972749

2.2下载Axis2所需jarhttps://download.csdn.net/download/xlb744868186/8301851

2.3将Axis2_Codegen_Wizard_1.4.0解压并放在eclipse安装文件plugins文件夹下,值得一提的是官网Apache Axis2 – Releases目前的版本为1.7.9生成客户端下载axis2-eclipse-service-plugin-1.7.9.zip,生成服务端使用axis2-eclipse-codegen-plugin-1.7.9.zip,如果放在高版本eclipse中,需要放在dropins文件夹下面,放在plugins下不会生效。关闭eclipse重启

2.4获取wsdl文件:将完整的webservice接口地址放在浏览器中访问,显示一个xml页面,右键另存为格式为wsdl的文件备用。

2.5新建空的java项目 Java Project,注意必须为java项目,非Dynamic Web Project

2.6右键新建项目,new - others,输入Axis2,选择Axis2 Code Generator - 选择Generate Java source code from a WSDL file,点击next - 选择前面保存的wsdl文件,next - 弹出options页面默认设置next - 弹出Output页面,选择Browse and select a project on current eclipse workspace,选择刚刚的java项目finish - 提示成功 - 刷新项目可以看到生成的代码了

2.7至少需要的jar

3.SoapUI创建

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值