Golang中如何将React.js的参数转换到GO/Golang

Golang中如何将React.js的参数转换到GO/Golang 将参数发送到GO/Golang,请参考以下代码:

const params = JSON.stringify({
  "administrador": administrador,
  "ativo": ativo,
  "dtCotas": dtCotas,
  "saldoInicial": saldoInicial,
  "vlrCotas": vlrCotas,
  "qtdeCotas": qtdeCotas,
  "dividendosCotas": dividendosCotas,
  "dividendos": dividendos,
  "qtdeNovasCotas": qtdeNovasCotas,
  "sobra": sobra,
});
axios.post (endpoint + "/api/insertOneInvestir/" + params, {
  headers: {
    "content-type": "application/json"
    // "Content-Type": "application/x-www-form-urlencoded"
  }
})

我无法在后端(GO)中恢复数据(参数),没有显示错误,但向数据库(MongoDB)写入的是空记录(集合);代码如下:

router.HandleFunc("/api/insertOneInvestir/{params}", middleware.CreateInvestir).Methods("POST", "OPTIONS")

func CreateInvestir(w http.ResponseWriter, r *http.Request) {
  w.Header().Set("Context-Type", "application/x-www-form-urlencoded")
  w.Header().Set("Access-Control-Allow-Origin", "*")
  w.Header().Set("Access-Control-Allow-Methods", "POST")
  w.Header().Set("Access-Control-Allow-Headers", "Content-Type")

  params := mux.Vars(r)
  var invest fundosinvestir
  _ = json.NewDecoder(r.Body).Decode(&invest)
  /*
    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&invest)

    if err != nil {
      panic(err)
    }
    ----------------------------------------------
      _ = json.NewDecoder(r.Body).Decode(&invest)
      //emps = append(emps, invest)
      insertOneInvestir(invest)
      json.NewEncoder(w).Encode(invest)
  */
  /*
      params := mux.Vars(r)
      var person Person
      _ = json.NewDecoder(r.Body).Decode(&person)
      person.ID = params["id"]
      people = append(people, person)
      json.NewEncoder(w).Encode(people)

  */
  /*
    fmt.Println(params["saldoInicial"])
    fmt.Println(params["vlrCotas"])
    fmt.Println(params["qtdeCotas"])
    fmt.Println(params["dividendosCotas"])
    fmt.Println(params["dividendos"])
    fmt.Println(params["qtdeNovasCotas"])
    fmt.Println(params["dividendos"])
    fmt.Println(params["qtdeNovasCotas"])
    fmt.Println(params["sobra"])
  */
  administrador := params["administrador"]
  ativo := params["ativo"]
  dtCotas := params["dtCotas"]
  saldoInicial, _ := strconv.ParseFloat(params["saldoInicial"], 64)
  fmt.Println(saldoInicial)
  vlrCotas, _ := strconv.ParseFloat(params["vlrCotas"], 64)
  fmt.Println(vlrCotas)
  qtdeCotas, _ := strconv.Atoi(params["qtdeCotas"])
  dividendosCotas, _ := strconv.ParseFloat(params["dividendosCotas"], 64)
  dividendos, _ := strconv.ParseFloat(params["dividendos"], 64)
  qtdeNovasCotas, _ := strconv.Atoi(params["qtdeNovasCotas"])
  fmt.Println(qtdeNovasCotas)
  sobra, _ := strconv.ParseFloat(params["sobra"], 64)
  fmt.Println(sobra)
  investirid := "5f9eaba56f323af8e6e91193"

  invest.Administrador = administrador
  invest.Ativo = ativo
  invest.DtCotas = dtCotas
  invest.SaldoInicial = saldoInicial
  invest.VlrCotas = vlrCotas
  invest.QtdeCotas = qtdeCotas
  invest.DividendosCotas = dividendosCotas
  invest.Dividendos = dividendos
  invest.QtdeNovasCotas = qtdeNovasCotas
  invest.Sobra = sobra
  invest.Investirid = investirid

  // fmt.Println(invest.Administrador, r.Body)
  insertOneInvestir(invest)
  json.NewEncoder(w).Encode(invest)
}

更多关于Golang中如何将React.js的参数转换到GO/Golang的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

wilsonpalmeira:

axios.post (endpoint + "/api/insertOneInvestir/" + params, {

这将使你的完整URL变成类似这样:

https://myendpoint.com/api/insertOneInvestir/{
“administrador”: "algún administrador",
“ativo”: true,
“dtCotas”: "algunas dtCotas",
...
}

这看起来不太对。

CreateInvestir 函数中的代码注释掉了JSON解码部分,看起来它转而使用了来自 muxx-www-form-urlencoded vars,但你对 axios.post 的调用看起来像是试图将其参数编码为 json。我不确定哪段代码是正确的,但当你确定之后,我认为你只需要将 params 放在 axios.post 调用的请求体中的某个位置(在 headers 键的同级是否有一个 body 键?)。

如果你选择使用URL编码的值,那么你首先需要将你的 params 转换为一组URL编码的键值对,而不是JSON。

更多关于Golang中如何将React.js的参数转换到GO/Golang的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中正确处理React.js发送的JSON参数,需要修正前端发送方式和后端接收逻辑。以下是具体解决方案:

前端修正(React.js):

// 正确发送JSON数据
const data = {
  administrador: administrador,
  ativo: ativo,
  dtCotas: dtCotas,
  saldoInicial: saldoInicial,
  vlrCotas: vlrCotas,
  qtdeCotas: qtdeCotas,
  dividendosCotas: dividendosCotas,
  dividendos: dividendos,
  qtdeNovasCotas: qtdeNovasCotas,
  sobra: sobra
};

axios.post(endpoint + "/api/insertOneInvestir/", data, {
  headers: {
    "Content-Type": "application/json"
  }
})

后端修正(Golang):

// 1. 修正路由定义(移除{params}路径参数)
router.HandleFunc("/api/insertOneInvestir/", middleware.CreateInvestir).Methods("POST", "OPTIONS")

// 2. 修正处理函数
func CreateInvestir(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
    
    // 处理预检请求
    if r.Method == "OPTIONS" {
        w.WriteHeader(http.StatusOK)
        return
    }
    
    var invest fundosinvestir
    
    // 直接从请求体解析JSON
    err := json.NewDecoder(r.Body).Decode(&invest)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    
    // 验证必要字段
    if invest.Administrador == "" || invest.Ativo == "" {
        http.Error(w, "Missing required fields", http.StatusBadRequest)
        return
    }
    
    // 设置默认值或处理逻辑
    investirid := "5f9eaba56f323af8e6e91193"
    invest.Investirid = investirid
    
    // 插入数据库
    result, err := insertOneInvestir(invest)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    // 返回响应
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(result)
}

// 3. 数据库插入函数示例
func insertOneInvestir(invest fundosinvestir) (interface{}, error) {
    // MongoDB插入示例
    collection := client.Database("yourdb").Collection("investir")
    result, err := collection.InsertOne(context.Background(), invest)
    if err != nil {
        return nil, err
    }
    return result.InsertedID, nil
}

// 4. 结构体定义示例
type fundosinvestir struct {
    Administrador    string  `json:"administrador" bson:"administrador"`
    Ativo           string  `json:"ativo" bson:"ativo"`
    DtCotas         string  `json:"dtCotas" bson:"dtCotas"`
    SaldoInicial    float64 `json:"saldoInicial" bson:"saldoInicial"`
    VlrCotas        float64 `json:"vlrCotas" bson:"vlrCotas"`
    QtdeCotas       int     `json:"qtdeCotas" bson:"qtdeCotas"`
    DividendosCotas float64 `json:"dividendosCotas" bson:"dividendosCotas"`
    Dividendos      float64 `json:"dividendos" bson:"dividendos"`
    QtdeNovasCotas  int     `json:"qtdeNovasCotas" bson:"qtdeNovasCotas"`
    Sobra          float64 `json:"sobra" bson:"sobra"`
    Investirid     string  `json:"investirid" bson:"investirid"`
}

调试和验证:

// 添加调试日志
func CreateInvestir(w http.ResponseWriter, r *http.Request) {
    // 读取原始请求体用于调试
    bodyBytes, _ := io.ReadAll(r.Body)
    fmt.Printf("Raw request body: %s\n", string(bodyBytes))
    
    // 重置请求体以便再次读取
    r.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
    
    // 继续正常处理...
    var invest fundosinvestir
    err := json.NewDecoder(r.Body).Decode(&invest)
    if err != nil {
        fmt.Printf("JSON decode error: %v\n", err)
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    
    fmt.Printf("Parsed struct: %+v\n", invest)
    // ... 其余代码
}

关键修正点:

  1. 前端直接发送JSON对象,而不是字符串化的URL参数
  2. 后端从请求体(r.Body)直接解析JSON到结构体
  3. 移除路由中的{params}路径参数
  4. 添加适当的错误处理和响应状态码
  5. 确保CORS头部正确设置
回到顶部