如何修改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
相关产品推荐
相关产品推荐

