【发布时间】:2020-01-05 13:08:21
【问题描述】:
我对 Golang 非常陌生,我编写了一个小的 REST API 来熟悉该语言,并且我使用 Mux 作为路由器。我想知道是否可以在如何为我的小 API 实现错误处理方面获得一些帮助,但我在解决这个问题时遇到了麻烦。我想使用错误结构来处理消息。 以下是我的代码:
type Trade struct {
ClientTradeId string `json:"clientTradeId"`
Date int `json:"date"`
Quantity string `json:"quantity"`
Price string `json:"price"`
Ticker string `json:"ticker"`
}
type InternalTrade struct {
Id string `json:"Id"`
Trade *Trade `json:"Trade"`
}
type TradeSubmitted struct {
TradeId string `json:"TradeId"`
ClientTradeId string `json:"clientTradeId"`
}
type Error struct {
Message string `json:"Message"`
}
var trades []InternalTrade
func getTrades(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
err := json.NewEncoder(w).Encode(trades)
if err != nil {
http.Error(w, err.Error(),500)
}
}
func getTradeById(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(r)
for _, trade := range trades {
if trade.Id == params["trade_id"] {
json.NewEncoder(w).Encode(trade)
return
}
}
json.NewEncoder(w).Encode(&InternalTrade{})
}
func createTrade(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var trade Trade
var tradeSubmitted TradeSubmitted
_ = json.NewDecoder(r.Body).Decode(&trade)
internal := InternalTrade{
Id: strconv.Itoa(rand.Intn(1000000)),
Trade: &trade,
}
tradeSubmitted.ClientTradeId = trade.ClientTradeId
tradeSubmitted.TradeId = internal.Id
trades = append(trades, internal)
json.NewEncoder(w).Encode(&tradeSubmitted)
}
func deleteTrade(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(r)
for idx, trade := range trades {
if trade.Id == params["trade_id"] {
trades = append(trades[:idx], trades[idx+1:]...)
break
}
}
json.NewEncoder(w).Encode(trades)
}
func updateTrade(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(r)
for idx, trade := range trades {
if trade.Id == params["trade_id"] {
trades = append(trades[:idx], trades[idx+1:]...)
var internal InternalTrade
_ = json.NewDecoder(r.Body).Decode(&internal.Trade)
internal.Id = params["trade_id"]
trades = append(trades, internal)
json.NewEncoder(w).Encode(internal)
return
}
}
}
func main() {
router := mux.NewRouter()
trades = append(trades, InternalTrade{ Id:"1", Trade: &Trade{ClientTradeId: "T-50264430-bc41", Date:20200101,
Quantity:"100", Price:"10.00", Ticker:"APPL"}})
trades = append(trades, InternalTrade{ Id:"2", Trade: &Trade{ClientTradeId: "T-99999999-ab14", Date:20200101,
Quantity:"100", Price:"420.00", Ticker:"TSLA"}})
router.HandleFunc("/v1/trades", getTrades).Methods("GET")
router.HandleFunc("/v1/trades/{trade_id}", getTradeById).Methods("GET")
router.HandleFunc("/v1/trades", createTrade).Methods("POST")
router.HandleFunc("/v1/trades/{trade_id}", deleteTrade).Methods("DELETE")
router.HandleFunc("/v1/trades/{trade_id}", updateTrade).Methods("PUT")
log.Fatal(http.ListenAndServe(":8080", router))
}
我想帮助在我的 createTrade 函数上实现一些错误处理,以便在传递不正确的类型时捕获 400,当请求缺少字段时捕获 422。 500 表示内部服务器错误,我想使用上面的错误结构传递自定义消息。
【问题讨论】: