Java 调用WebService三种简单的方式

下面我们来看Java如何通过WSDL文件来调用这些web service:
注意:不同版本的Axis相差很大,大家最好以apache网站上的例子为准,这里仅仅用于说明其基本用法。
调用WebService服务步骤:
a.首先拿到WSdl文档,找到服务地址:http://172.19.0.153:8080/scs-web/webservice/SignService?WSDL

b.使用工具soapui,创建测试项目如图,知道接口方法名和参数

c.创建调用的代码

1.直接AXIS调用远程的webservice
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class WebServiceClient {
public static void main(String[] args) {
try {
String endpoint = "http://172.19.0.153:8080/scs-web/webservice/SignService";
// 直接引用远程的wsdl文件
// 以下都是套路
Service service = new Service();
call.setOperationName("signContract");// WSDL里面描述的接口名称
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.addParameter("channel",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.addParameter("templateId",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.addParameter("strJson",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.addParameter("isSeal",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.addParameter("callBackUrl",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 设置返回类型
String templateId = "3021";
String channel = "1007";
String strJson = "{\"certApplys\":[{\"useridno\":\"N256613448988875\",\"address\":\"山东省德州临邑县恒源\",\"engName\":\"test\",\"telno\":\"15869611844\",\"email\":\"test@credithc.com\",\"username\":\"CHENG AI-HSIANG\",\"idTypeCode\":\"Z\"}],\"singnalElement\":{\"a\":\"\",\"b\":\"√\",\"product\":\"利投宝12_B\",\"amount\":\"100,000.00\",\"idType\":\"户照\",\"year\":2016,\"paybankName\":\"兴业银行\",\"backbankCardNo\":\"622908357966352914\",\"idNo\":\"N213447\",\"month\":12,\"lockTime\":12,\"paybankCardNo\":\"622908357966352914\",\"bigAmount\":\"壹拾万元整\",\"name\":\"CHENG AI-HSIANG\",\"customerId\":\"C_20161214000158\",\"contractId\":\"L_20161214291739\",\"backbankName\":\"兴业银行\",\"yearIrr\":\"9.6%\",\"payName\":\"CHENG AIHSIANG\",\"day\":14}}\r\n";
String isSeal = "1";
String callBackUrl = "?";

String result = (String) call.invoke(new Object[] {channel,templateId,isSeal,strJson,callBackUrl});
// 给方法传递参数,并且调用方法
System.out.println("result is :" + result);
} catch (Exception e) {
System.err.println(e.toString());
}
}
}

2.使用Http方式调用远程的webservice
package com.webservice;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class WebServiceClient2 {
public static void main(String[] args) {
try {
// 1 指定WebService服务的请求地址:
String wsUrl = "http://172.19.0.153:8080/scs-web/webservice/SignService";

// 2 创建URL:
URL url = new URL(wsUrl);
// 3 建立连接,并将连接强转为Http连接
URLConnection conn = url.openConnection();
HttpURLConnection con = (HttpURLConnection) conn;

// 4,设置请求方式和请求头:
con.setDoInput(true); // 是否有入参
con.setDoOutput(true); // 是否有出参
con.setRequestMethod("POST"); // 设置请求方式
con.setRequestProperty("content-type", "text/xml;charset=UTF-8");

// 5,手动构造请求体
String channel = "1007";
String templateId = "3021";
String isSeal = "1";
String strJson = "{\"certApplys\":[{\"useridno\":\"N256613448988875\",\"address\":\"山东省德州临邑县恒源\",\"engName\":\"test\",\"telno\":\"15869611844\",\"email\":\"test@credithc.com\",\"username\":\"CHENG AI-HSIANG\",\"idTypeCode\":\"Z\"}],\"singnalElement\":{\"a\":\"\",\"b\":\"√\",\"product\":\"利投宝12_B\",\"amount\":\"100,000.00\",\"idType\":\"户照\",\"year\":2016,\"paybankName\":\"兴业银行\",\"backbankCardNo\":\"622908357966352914\",\"idNo\":\"N213447\",\"month\":12,\"lockTime\":12,\"paybankCardNo\":\"622908357966352914\",\"bigAmount\":\"壹拾万元整\",\"name\":\"CHENG AI-HSIANG\",\"customerId\":\"C_20161214000158\",\"contractId\":\"L_20161214291739\",\"backbankName\":\"兴业银行\",\"yearIrr\":\"9.6%\",\"payName\":\"CHENG AIHSIANG\",\"day\":14}}\r\n";
String callBackUrl = "?";

  String  requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"";
requestBody += " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"";
requestBody += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">";
requestBody += "<soapenv:Body>";
requestBody += "<q0:signContract xmlns:q0=\"http://impl.webservice.scs.credithc.com/\">";
requestBody += "<channel>" + channel + "</channel>";
requestBody += "<templateId>" + templateId + "</templateId> ";
requestBody += "<isSeal>" + isSeal + "</isSeal> ";
requestBody += "<strJson>" + strJson + "</strJson> ";
requestBody += "<callBackUrl>" + callBackUrl + "</callBackUrl> ";
requestBody += "</q0:signContract>";
requestBody += "</soapenv:Body>";

 

requestBody += "</soapenv:Envelope>";

// 6,通过流的方式将请求体发送出去:
OutputStream out = con.getOutputStream();
out.write(requestBody.getBytes());
out.close();
// 7,服务端返回正常:
int code = con.getResponseCode();
if (code == 200) {// 服务端返回正常
InputStream is = con.getInputStream();
byte[] b = new byte[1024];
StringBuffer sb = new StringBuffer();
int len = 0;
while ((len = is.read(b)) != -1) {
String str = new String(b, 0, len, "UTF-8");
sb.append(str);
}
System.out.println(sb.toString());
    is.close();
}
con.disconnect();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}

3.springboot 动态调用

package com.credithc.re.sign.webservice;

import com.credithc.re.sign.service.RedisService;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import java.util.UUID;

@WebService(name = "reSignService")
@Component
public class ReSignService {

    @Autowired
    private RedisService redisService;

    @WebMethod
    @WebResult
    public String reSign(@WebParam(name = "channel") String channel,
                         @WebParam(name = "templateId") String templateId,
                         @WebParam(name = "isSeal") int isSeal,
                         @WebParam(name = "strJson") String strJson,
                         @WebParam(name = "callBackUrl") String callBackUrl) {
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        redisService.set(uuid, callBackUrl);
        callBackUrl = "http://172.19.0.153:8081/re/sign/callback" + "?id=" + uuid;
        
        // 创建动态客户端
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient("http://172.19.0.153:8080/scs-web/webservice/SignService?wsdl");
        Object[] objects = new Object[0];
        try {
            QName opName = new QName("http://webservice.scs.credithc.com/", "signContract");
            objects = client.invoke(opName, channel, templateId, isSeal, strJson, callBackUrl);
            System.out.println("返回数据:" + objects[0]);
        } catch (java.lang.Exception e) {
            e.printStackTrace();
        }
        return "请求成功";
    }
}
package com.credithc.re.sign.config;

import com.credithc.re.sign.webservice.ReSignService;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.xml.ws.Endpoint;

@Configuration
public class CxfConfig {

    @Autowired
    private Bus bus;

    @Autowired
    private ReSignService reSignService;

    @Bean
    public Endpoint endpoint(){
        EndpointImpl endpoint = new EndpointImpl(bus,reSignService);
        endpoint.publish("/reSignService");
        return endpoint;
    }
}

发布地址:http://127.0.0.1:8081/services/reSignService?WDDL

 

### RISC-V 架构汇编语言入门 #### 什么是RISC-V? RISC-V是一种基于精简指令集计算(RISC)原则的开源指令集架构(ISA)[^1]。这种开放标准允许任何人设计、制造和销售RISC-V芯片和软件而不必支付专利费用。 #### 基础概念 在深入探讨具体的汇编语法前,理解一些基础的概念非常重要: - **寄存器**:RISC-V拥有32个通用目的寄存器,每个都是64位宽,在RV64I版本中;对于RV32I,则是32位宽。这些寄存器用于存储数据并参与运算操作。 - **内存模型**:采用Load/Store架构意味着只有特定类型的加载(load)和储存(store)指令可以访问内存地址中的值[^2]。 #### 指令格式 每条RISC-V指令都有固定的长度——通常是32比特,并由以下几个部分组成: - opcode (操作码): 定义要执行的操作类型 - rs1, rs2 (源寄存器): 提供输入数值给算术逻辑单元(ALU) - rd (目标寄存器): 存储ALU的结果 - imm (立即数): 直接编码于指令内的常量值 #### 示例代码 下面是一个简单的例子,展示了如何用RISC-V汇编语言编写一段程序来加两个数字并将结果保存到另一个位置: ```assembly .text # 开始定义可执行代码段 main: # 主函数标签 li t0, 5 # 将整数5加载至临时寄存器t0 li t1, 7 # 同样地初始化第二个变量为7 add t2, t0, t1 # 把t0+t1的结果放入t2 ebreak # 结束调试模式下的运行 ``` 这段代码首先设置了`.text`节表示接下来的内容将是机器能够执行的指令序列。接着通过`li`(load immediate)命令分别向两个不同的暂存器`t0`, `t1`赋初值5和7。最后利用`add`指令完成两者的相加以获得最终求和后的值,并将其放置在一个新的暂存器`t2`里。 #### 控制流语句 除了基本的数据处理外,控制结构也是任何编程环境中不可或缺的一部分。这里简单介绍几种常见的条件分支以及循环机制是如何在RISC-V汇编中实现的: ##### 条件跳转 当需要根据某个表达式的真假决定是否转向其他地方继续执行时,就可以使用如下形式之一来进行判断: - beq rs1,rs2,label —— 如果rs1等于rs2则跳转到label处; - bne rs1,rs2,label —— 若不等则转移; - blt/bge ... etc. 例如: ```assembly beq zero, ra, exit # 当ra==0时跳转到exit标记的位置 ``` ##### 循环 为了重复某些动作直到满足一定条件为止,可以通过组合上述提到过的比较与跳跃指令达成效果。比如最常用的while-do风格伪代码转换成实际汇编的样子可能是这样的: ```assembly loop_start: sltiu t0, a0, 1 # 设置标志位(t0),如果a0<1成立就置true beqz t0, loop_end # 如果上面设置失败即跳出循环体 # (此处省略具体业务逻辑) j loop_start # 返回顶部重新评估终止条件 loop_end: ``` 以上就是关于RISC-V汇编语言的一些基础知识概述及其应用实例说明。希望这能帮助读者建立起对该主题初步的认识框架。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值