簡體   English   中英

Go HTTP Post Request 沒有為 Ruby On Rails API 正確格式化數據

[英]Go HTTP Post Request not formatting data properly for Ruby On Rails API

我在 Go 中構建了一個客戶端來與我的 Rails API 交互。 我有一個帶有 test 單個字符串屬性的模型欄。 我正在嘗試遍歷一系列字符串,這些字符串是測試屬性的值,並將 POST 請求發送到我的 API。

這是我的 Go 客戶端的代碼:

for _,data := range attributes{
    client := new(http.Client)

    body := []byte(fmt.Sprintf("bar: {test: %s}", data))
    fmt.Println(string(body))

    req, err := http.NewRequest(
      "POST",
      "http://localhost:3000/bars.json",
      bytes.NewReader(body),
    )

在我的 Rails 服務器的后端,這是我得到的錯誤:

ActionController::ParameterMissing (param is missing or the value is empty: bar):
  
app/controllers/bars_controller.rb:70:in `bar_params'
app/controllers/bars_controller.rb:25:in `create'
Invalid or incomplete POST params

我嘗試用幾種不同的方式格式化我的 Go 請求,但似乎沒有任何東西可以與 API 一起正常工作。 如何正確格式化我的發布請求的數據?

  1. 那是"bar: {test: %s}"不是一個有效的 json,嘗試"{ "bar": {"test": "%s"} }" (注意引號和括號),最好使用json.Marshal
  2. 添加 json 內容類型頭req.Header.Set("Content-Type", "application/json; charset=UTF-8")

"bar: {test: %s}"是您剛剛發明的隨機、任意編碼,Rails 不可能理解如何解析它,除非您還在 Rails 端編寫了一些自定義解碼器。

您不能僅在通信通道的一端發明新的數據編碼。 您需要堅持客戶端和服務器都可以理解的編碼。 對於 HTTP,這通常意味着以 已知格式對您的請求正文進行編碼,例如application/x-www-form-urlencoded

因為這是眾所周知的標准的一部分,所以 Go 為您提供了輕松執行此操作的方法; 它將處理將數據編碼到請求正文中並設置正確的Content-Type標頭,告訴 Rails 如何解碼正文:

data := url.Values{
    "bar[test]": "%s"       
}

resp, err := http.PostForm("http://localhost:3000/bars.json", data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM