You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将同一解决方案下的两个项目拆分并通过Web API实现相互通信

拆分后项目通过Web API实现跨服务通信的实现方案

1. 提前对齐通信契约

  • 先梳理两个项目原有的所有交互场景,把需要跨服务调用的操作抽象为公开API接口,统一约定每个接口的请求参数、响应格式、错误码规则、调用频次限制,默认采用JSON作为数据传输格式。
  • 举个例子:如果项目B需要获取项目A存储的用户基础信息,提前明确GET /api/v1/users/{userId}的接口规范,所有入参、出参、异常返回结构双方提前对齐,避免联调时出现结构不兼容问题。

2. 被调用方API实现规范

  • 对外提供服务的项目新增独立的API控制器层,和内部业务逻辑解耦,后续对外接口迭代不会直接影响内部业务流程。
  • 必须增加接口鉴权逻辑,不允许未授权访问:轻量场景推荐用API Key校验,调用方请求时在请求头携带X-API-Key参数,被调用方校验密钥有效性后再放行;对安全性要求更高的场景可以采用JWT令牌鉴权。
    .NET Web API的API Key校验中间件参考代码:
public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private const string API_KEY_HEADER = "X-API-Key";
    private readonly IConfiguration _configuration;

    public ApiKeyMiddleware(RequestDelegate next, IConfiguration configuration)
    {
        _next = next;
        _configuration = configuration;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        if (!context.Request.Headers.TryGetValue(API_KEY_HEADER, out var extractedApiKey))
        {
            context.Response.StatusCode = 401;
            await context.Response.WriteAsync("Missing API Key");
            return;
        }
        var validKey = _configuration.GetValue<string>("ValidApiKeys:ProjectB");
        if (!validKey.Equals(extractedApiKey))
        {
            context.Response.StatusCode = 403;
            await context.Response.WriteAsync("Invalid API Key");
            return;
        }
        await _next(context);
    }
}
  • 所有涉及数据写入的接口必须做好幂等性处理,避免重复调用导致数据异常。

3. 调用方请求逻辑封装

  • 调用方不要在业务代码里硬编码HTTP请求,建议封装独立的HTTP客户端服务,统一处理请求地址、鉴权头添加、超时设置、重试逻辑、异常捕获。
    .NET 下HttpClient封装参考代码:
// 项目B中调用项目A接口的客户端封装
public class ProjectAApiClient
{
    private readonly HttpClient _httpClient;
    private const string API_KEY = "项目B对应的合法API密钥";

    public ProjectAApiClient(HttpClient httpClient)
    {
        _httpClient = httpClient;
        _httpClient.BaseAddress = new Uri("https://项目A的内网/公网访问地址");
        _httpClient.DefaultRequestHeaders.Add("X-API-Key", API_KEY);
        _httpClient.Timeout = TimeSpan.FromSeconds(10);
    }

    public async Task<UserInfo> GetUserInfoAsync(Guid userId)
    {
        var response = await _httpClient.GetAsync($"/api/v1/users/{userId}");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadFromJsonAsync<UserInfo>();
    }
}
  • 在依赖注入容器中注册该客户端后,即可直接在业务代码中注入调用。

4. 部署联调注意事项

  • 如果两个项目部署在同一内网环境,优先用内网域名通信,降低公网延迟和数据泄露风险。
  • 做好接口版本管理,后续接口迭代不要直接修改已上线的v1版本接口,新增v2版本避免影响原有调用逻辑。
  • 补充接口调用日志,记录所有跨服务调用的请求参数、响应结果、耗时,方便后续问题排查。

内容的提问来源于stack exchange,提问作者user6838116

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 04:36:02