杰瑞科技汇

Java如何调用C语言的WebService接口?

SOAP WebServiceRESTful WebService


调用 C# 的 SOAP WebService

SOAP (Simple Object Access Protocol) 是一种基于 XML 的协议,非常严格和正式,传统的 .NET (WCF/ASMX) 服务通常使用 SOAP。

核心步骤:

  1. 获取 WSDL 文件:这是服务的“说明书”,描述了所有可用的方法、参数和返回值的结构。
  2. 使用 Java 客户端工具生成调用代码:最常用的是 wsimport (JDK 自带) 或第三方工具如 cxf
  3. 生成并使用客户端代码:将生成的代码集成到你的 Java 项目中,然后像调用本地方法一样调用远程服务。

详细教程 (以 wsimport 为例)

假设我们有一个 C# 的 SOAP WebService,其地址是 http://www.example.com/MyCSharpService.asmx?wsdl

第 1 步:获取 WSDL 文件

WSDL 文件通常通过在 WebService URL 后面加上 ?wsdl 参数来访问。 http://www.example.com/MyCSharpService.asmx?wsdl

Java如何调用C语言的WebService接口?-图1

你需要将这个 URL 提供给 Java 的客户端生成工具。

第 2 步:使用 wsimport 生成客户端代码

打开你的命令行(CMD 或 PowerShell),执行以下命令:

# 基本命令
wsimport -p com.example.client -keep http://www.example.com/MyCSharpService.asmx?wsdl

命令参数说明:

Java如何调用C语言的WebService接口?-图2

  • wsimport: JDK 自带的工具,位于 JDK 的 bin 目录下。
  • -p com.example.client: 指定生成代码的包名,你可以根据需要修改。
  • -keep: 生成代码后,保留编译过程中的 .java 源文件,方便查看和调试。
  • -d .: 指定编译后的 .class 文件存放目录,默认是当前目录。
  • -extension: 允许使用一些非标准的扩展,如果遇到生成错误,可以尝试加上这个参数。
  • WSDL 文件的 URL。

执行成功后,会在你指定的包目录下生成一堆 Java 文件,主要包括:

  • XXX.java: 对应 WSDL 中定义的 portType 接口,这是你主要调用的接口。
  • XXXService.java: 服务工厂类,用于获取 XXX 接口的实例。
  • XXXException.java: 可能抛出的异常类。
  • 以及一堆用于表示 XML 数据结构的 XXXType.java, XXXObjectFactory.java 等。

第 3 步:在 Java 项目中使用生成的代码

  1. 创建 Java 项目:在你的 IDE(如 IntelliJ IDEA 或 Eclipse)中创建一个新的 Java 项目。
  2. 添加生成的代码:将 wsimport 生成的所有 .java 文件复制到你的项目中,或者将编译后的 .class 文件打包成 JAR 文件添加到项目的类路径中。
  3. 编写调用代码
import com.example.client.MyCSharpService; // 这是生成的 Service 类
import com.example.client.MyCSharpService_Service; // 这是生成的 Service Factory 类
import com.example.client.YourRequestType; // 假设这是请求参数的类
import com.example.client.YourResponseType; // 假设这是返回结果的类
public class SoapClient {
    public static void main(String[] args) {
        try {
            // 1. 创建服务工厂实例
            MyCSharpService_Service service = new MyCSharpService_Service();
            // 2. 获取服务端口,即我们定义的接口
            MyCSharpService port = service.getMyCSharpServicePort(); // 注意:方法名 getXXXPort() 是 wsimport 生成的标准格式
            // 3. 准备请求参数 (根据生成的代码创建对象)
            YourRequestType request = new YourRequestType();
            request.setName("Java Client");
            request.setId(123);
            // 4. 调用远程方法
            System.out.println("正在调用 C# WebService...");
            YourResponseType response = port.yourWebServiceMethod(request); // 替换成你的方法名
            // 5. 处理返回结果
            System.out.println("调用成功!");
            System.out.println("返回结果: " + response.getResult());
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("调用 WebService 失败: " + e.getMessage());
        }
    }
}

常见问题与解决方案

  • 问题1:wsimport 报错,提示不支持某些 SOAP 扩展。

    • 解决:尝试在命令中加入 -extension 参数。
    • 解决:如果问题依旧,可以考虑使用更强大的 Apache CXF 工具,它对标准的支持更好,功能也更丰富。
  • 问题2:C# 服务使用 HTTPS,并且有自签名证书。

    Java如何调用C语言的WebService接口?-图3

    • 解决:Java 默认不信任自签名证书,你需要配置 JVM 的信任库,一种简单的方法(不推荐用于生产)是忽略所有 SSL 证书验证,可以在调用代码前添加以下代码:

      import javax.net.ssl.HttpsURLConnection;
      import javax.net.ssl.SSLContext;
      import javax.net.ssl.TrustManager;
      import javax.net.ssl.X509TrustManager;
      import java.security.cert.X509Certificate;
      // 忽略 SSL 证书验证 (仅用于测试!)
      static {
          try {
              TrustManager[] trustAllCerts = new TrustManager[] {
                  new X509TrustManager() {
                      public X509Certificate[] getAcceptedIssuers() { return null; }
                      public void checkClientTrusted(X509Certificate[] certs, String authType) { }
                      public void checkServerTrusted(X509Certificate[] certs, String authType) { }
                  }
              };
              SSLContext sc = SSLContext.getInstance("SSL");
              sc.init(null, trustAllCerts, new java.security.SecureRandom());
              HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
          } catch (Exception e) {
              e.printStackTrace();
          }
      }

调用 C# 的 RESTful WebService

新建的 .NET Core / .NET 5+ 服务更倾向于使用 RESTful API,它基于 HTTP 协议,使用 JSON 作为数据交换格式,比 SOAP 更轻量、更灵活。

核心步骤:

  1. 了解 API 端点:知道每个方法的 URL、HTTP 方法(GET, POST, PUT, DELETE)、请求头(如 Content-Type)和请求/响应的 JSON 结构。
  2. 选择一个 HTTP 客户端库:Java 标准库的 HttpURLConnection 比较繁琐,推荐使用第三方库,如 Apache HttpClientOkHttp,这里以 Apache HttpClient 为例。
  3. 构建请求并发送:使用库构建 HTTP 请求,发送到 C# 服务端,并接收和解析 JSON 响应。
  4. 处理 JSON:使用如 JacksonGson 这样的库将 JSON 字符串转换为 Java 对象,或将 Java 对象转换为 JSON 字符串。

详细教程 (Apache HttpClient + Jackson)

假设 C# REST API 的一个端点是:

  • URL: http://www.example.com/api/users
  • 方法: POST
  • 请求头: Content-Type: application/json
  • 请求体 (JSON): {"name": "John Doe", "email": "john.doe@example.com"}
  • 响应体 (JSON): {"id": 1, "name": "John Doe", "email": "john.doe@example.com"}

第 1 步:添加 Maven 依赖

在你的 pom.xml 文件中添加以下依赖:

<!-- Apache HttpClient for making HTTP requests -->
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3.1</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5-fluent</artifactId>
    <version>5.3.1</version>
</dependency>
<!-- Jackson for JSON processing -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>

第 2 步:创建 Java 实体类

为了方便地处理

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