杰瑞科技汇

C如何调用Java的WebService?

使用第三方 C 语言库来处理 SOAP 协议和 HTTP 通信

C如何调用Java的WebService?-图1
(图片来源网络,侵删)

下面我将为你详细介绍几种主流的方法,并提供一个详细的实践示例。


核心概念:SOAP vs. REST

在开始之前,需要明确你的 Java WebService 是哪种类型:

  1. SOAP (Simple Object Access Protocol) WebService

    • 特点:基于 XML,协议规范严格,有 WSDL (Web Services Description Language) 文件来描述接口、方法、参数和返回值。
    • 适用场景:企业级应用,对安全性、事务性要求高的场景。
    • C 调用方式:使用专门的 SOAP 客户端库,如 gSOAPAxis2/C
  2. RESTful WebService

    C如何调用Java的WebService?-图2
    (图片来源网络,侵删)
    • 特点:基于 HTTP 协议,通常使用 JSON 或 XML 作为数据格式,更轻量级,没有统一的 WSDL 标准。
    • 适用场景:移动应用、Web 前后端分离、API 设计。
    • C 调用方式:使用通用的 HTTP 客户端库(如 libcurl)来发送 HTTP 请求(GET, POST, PUT, DELETE),并手动或使用 JSON 解析库(如 cJSON)来处理请求和响应数据。

使用 gSOAP 库调用 SOAP WebService (推荐)

gSOAP 是一个非常强大和流行的 C/C++ 开源工具包,用于开发 SOAP/XML WebService 客户端和服务器,它最大的优点是可以从 WSDL 文件自动生成 C/C++ 的客户端存根代码,大大简化了调用过程。

优点

  • 自动化:从 WSDL 自动生成调用代码,无需手动编写复杂的 SOAP 消息。
  • 功能强大:支持 SOAP 1.1, 1.2, WSDL, WS-* 等标准。
  • 跨平台:支持 Windows, Linux, macOS 等。

缺点

  • 学习曲线:需要学习 gSOAP 的基本使用和配置。
  • 代码侵入性:生成的代码与 gSOAP 库紧密耦合。

详细实践:使用 gSOAP 调用 Java WebService

假设我们有一个简单的 Java WebService,它提供了一个根据用户名获取用户信息的功能。

第 1 步:准备 Java WebService 和 WSDL

这里我们使用一个简单的 Java WebService 作为示例,你可以使用任何 Java 框架(如 Apache CXF, Axis2, Spring Boot)来创建它。

Java 接口 (UserService.java):

C如何调用Java的WebService?-图3
(图片来源网络,侵删)
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public interface UserService {
    @WebMethod
    String getUserInfo(String username);
}

Java 实现类 (UserServiceImpl.java):

import javax.jws.WebService;
@WebService(endpointInterface = "com.example.UserService")
public class UserServiceImpl implements UserService {
    @Override
    public String getUserInfo(String username) {
        System.out.println("C Client is requesting info for user: " + username);
        if ("Alice".equals(username)) {
            return "Name: Alice, Role: Admin";
        } else if ("Bob".equals(username)) {
            return "Name: Bob, Role: User";
        } else {
            return "User not found";
        }
    }
}

获取 WSDL 文件: 将这个 WebService 部署到 Tomcat 或其他服务器上后,访问 http://your-server:port/your-service-context/UserService?wsdl,你会看到一个 XML 文件,这就是 WSDL。

第 2 步:安装 gSOAP

在 Linux (Ubuntu/Debian) 上:

sudo apt-get update
sudo apt-get install gsoap-dev

这会安装 wsdl2hsoapcpp2 工具。

在 Windows 上:

  1. gSOAP 官网 下载 gSOAP SDK。
  2. 解压并将 bin 目录添加到系统的 PATH 环境变量中。

第 3 步:使用 gSOAP 工具生成客户端代码

  1. 将 WSDL 文件下载到本地 将上一步获取的 WSDL 内容保存为一个文件,user.wsdl

  2. 生成头文件 (.h) 使用 wsdl2h 工具从 WSDL 生成 C/C++ 的头文件。

    wsdl2h -o user.h user.wsdl

    这会生成一个 user.h 文件,里面包含了所有数据结构的定义。

  3. 生成客户端存根代码 (.c, .cpp) 使用 soapcpp2 工具从头文件生成客户端调用代码。

    soapcpp2 -i -C -x user.h
    • -i: 生成导入文件。
    • -C: 只生成客户端代码。
    • -x: 禁用 XML 例子文件生成。

    执行后,你会得到一堆文件,其中最重要的是:

    • soapC.c: 序列化/反序列化函数的实现。
    • soapStub.h: 客户端存根的头文件。
    • userSoap.nsmap: 命名空间映射文件。

第 4 步:编写 C 调用代码

我们可以编写一个 C 程序来调用 WebService。

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "soapStub.h" // 包含生成的存根头文件
#include "user.nsmap" // 包含命名空间映射
int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <username>\n", argv[0]);
        return 1;
    }
    const char *username = argv[1];
    struct soap soap; // 创建一个 SOAP 上下文
    // 初始化 SOAP 环境
    soap_init(&soap);
    // 设置目标 WebService 的 URL
    // !!! 重要:请替换为你的实际 WSDL 地址中的 location 地址 !!!
    // 你可以在 user.wsdl 中找到 <soap:address location="..."/> 标签
    soap_endpoint = "http://localhost:8080/YourWebService/services/UserService";
    // 准备输入参数
    _ns1__getUserInfo request;
    request.username = (char*)username;
    // 准备接收返回值的结构体
    _ns1__getUserInfoResponse response;
    // 调用 WebService 方法
    // 参数1: SOAP环境
    // 参数2: 输入参数
    // 参数3: 输出参数
    int result = soap_call___ns1__getUserInfo(&soap, NULL, NULL, &request, &response);
    if (result == SOAP_OK) {
        // 调用成功
        printf("Successfully called WebService.\n");
        if (response.return_ != NULL) {
            printf("User Info: %s\n", response.return_);
        } else {
            printf("WebService returned null.\n");
        }
    } else {
        // 调用失败
        soap_print_fault(&soap, stderr); // 打印详细的错误信息
    }
    // 清理 SOAP 环境
    soap_destroy(&soap);
    soap_end(&soap);
    soap_done(&soap);
    return 0;
}

第 5 步:编译和运行

  1. 编译 你需要链接 gSOAP 的库,在 Linux 上,可以这样编译:

    gcc main.c soapC.c -o client -lgsoap++
    • main.c: 你的主程序。
    • soapC.c: gSOAP 生成的序列化代码。
    • -lgsoap++: 链接 gSOAP 的 C++ 库(即使你写的是 C 代码,gSOAP 的核心库也是 C++ 的)。
  2. 运行 确保 Java WebService 正在运行,然后执行你的 C 客户端程序。

    ./client Alice

    预期输出:

    Successfully called WebService.
    User Info: Name: Alice, Role: Admin

使用 libcurl 调用 RESTful WebService

如果你的 Java WebService 是 RESTful 风格的,并且返回 JSON 数据,那么使用 libcurl 是一个更轻量级的选择。

  1. 安装 libcurl

    • Linux: sudo apt-get install libcurl4-openssl-dev
    • Windows: 下载预编译库或从源码编译。
  2. **安装 JSON 解析库 (如 cJSON)

分享:
扫描分享到社交APP
上一篇
下一篇