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

下面我将为你详细介绍几种主流的方法,并提供一个详细的实践示例。
核心概念:SOAP vs. REST
在开始之前,需要明确你的 Java WebService 是哪种类型:
-
SOAP (Simple Object Access Protocol) WebService
- 特点:基于 XML,协议规范严格,有 WSDL (Web Services Description Language) 文件来描述接口、方法、参数和返回值。
- 适用场景:企业级应用,对安全性、事务性要求高的场景。
- C 调用方式:使用专门的 SOAP 客户端库,如 gSOAP 或 Axis2/C。
-
RESTful WebService
(图片来源网络,侵删)- 特点:基于 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):

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
这会安装 wsdl2h 和 soapcpp2 工具。
在 Windows 上:
- 从 gSOAP 官网 下载 gSOAP SDK。
- 解压并将
bin目录添加到系统的PATH环境变量中。
第 3 步:使用 gSOAP 工具生成客户端代码
-
将 WSDL 文件下载到本地 将上一步获取的 WSDL 内容保存为一个文件,
user.wsdl。 -
生成头文件 (
.h) 使用wsdl2h工具从 WSDL 生成 C/C++ 的头文件。wsdl2h -o user.h user.wsdl
这会生成一个
user.h文件,里面包含了所有数据结构的定义。 -
生成客户端存根代码 (
.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 步:编译和运行
-
编译 你需要链接 gSOAP 的库,在 Linux 上,可以这样编译:
gcc main.c soapC.c -o client -lgsoap++
main.c: 你的主程序。soapC.c: gSOAP 生成的序列化代码。-lgsoap++: 链接 gSOAP 的 C++ 库(即使你写的是 C 代码,gSOAP 的核心库也是 C++ 的)。
-
运行 确保 Java WebService 正在运行,然后执行你的 C 客户端程序。
./client Alice
预期输出:
Successfully called WebService. User Info: Name: Alice, Role: Admin
使用 libcurl 调用 RESTful WebService
如果你的 Java WebService 是 RESTful 风格的,并且返回 JSON 数据,那么使用 libcurl 是一个更轻量级的选择。
-
安装 libcurl
- Linux:
sudo apt-get install libcurl4-openssl-dev - Windows: 下载预编译库或从源码编译。
- Linux:
-
**安装 JSON 解析库 (如 cJSON)
