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

如何修改Golang Broker服务代码,让Postman返回认证服务状态码

问题解决:传递认证服务的状态码到Postman客户端

原代码的核心问题是:收到认证服务的非成功状态码时仅记录日志就直接返回,没有将对应的状态码和响应内容传递给前端(Postman);同时成功场景下也未把生成的响应写入http.ResponseWriter,导致客户端只能拿到默认的200状态码,没有实际响应内容。

以下是修改后的完整代码:

func Authenticate(w http.ResponseWriter, a AuthPayload) {
    // 构造请求JSON并发送给认证服务
    jsonData, err := json.Marshal(a)
    if err != nil {
        log.Printf("序列化请求失败: %s", err)
        w.WriteHeader(http.StatusInternalServerError)
        json.NewEncoder(w).Encode(jsonResponse{Error: true, Message: "内部服务错误"})
        return
    }
    log.Printf("请求JSON: %s", jsonData)

    // 创建请求并调用认证服务
    request, err := http.NewRequest("POST", "http://authentication-service:8081/authenticateuser", bytes.NewBuffer(jsonData))
    if err != nil {
        log.Printf("无法创建请求连接认证服务: %s", err)
        w.WriteHeader(http.StatusInternalServerError)
        json.NewEncoder(w).Encode(jsonResponse{Error: true, Message: "无法连接认证服务"})
        return
    }
    // 必须设置Content-Type,否则认证服务可能无法正确解析JSON
    request.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    response, err := client.Do(request)
    if err != nil {
        log.Printf("调用认证服务出错: %s", err)
        w.WriteHeader(http.StatusInternalServerError)
        json.NewEncoder(w).Encode(jsonResponse{Error: true, Message: "调用认证服务失败"})
        return
    }
    defer response.Body.Close()

    // 直接将认证服务的状态码返回给客户端
    w.WriteHeader(response.StatusCode)

    // 如果认证服务返回非200状态,直接转发其响应内容
    if response.StatusCode != http.StatusOK {
        var errorResp jsonResponse
        if err := json.NewDecoder(response.Body).Decode(&errorResp); err == nil {
            json.NewEncoder(w).Encode(errorResp)
        } else {
            // 解析失败时返回通用错误信息
            json.NewEncoder(w).Encode(jsonResponse{Error: true, Message: "认证失败,无法获取详细错误信息"})
        }
        return
    }

    // 处理成功响应
    var jsonFromAuthService jsonResponse
    if err := json.NewDecoder(response.Body).Decode(&jsonFromAuthService); err != nil {
        log.Printf("解析认证服务响应失败: %s", err)
        w.WriteHeader(http.StatusInternalServerError)
        json.NewEncoder(w).Encode(jsonResponse{Error: true, Message: "解析认证响应失败"})
        return
    }

    // 构造成功响应并返回
    payload := jsonResponse{Error: false, Message: "用户认证成功", Data: jsonFromAuthService.Data}
    json.NewEncoder(w).Encode(payload)
}

关键修改说明:

  • 传递状态码:通过w.WriteHeader(response.StatusCode)直接将认证服务返回的状态码设置给客户端响应,比如400、401这类错误码都会被转发到Postman。
  • 错误场景处理:
    • 当调用认证服务出现网络错误、请求创建失败时,返回500内部错误状态码和对应提示。
    • 当认证服务返回非200状态时,尝试解析其错误响应并转发给客户端;如果解析失败,返回通用错误信息。
  • 成功场景完善:原代码仅执行json.Marshal(payload)但未写入响应,现在用json.NewEncoder(w).Encode(payload)将成功响应发送给客户端。
  • 添加Content-Type头:给请求添加Content-Type: application/json,确保认证服务能正确解析传入的JSON数据,避免因格式问题导致的异常响应。

内容的提问来源于stack exchange,提问作者Black Eyed Beans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:03:34