[英]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 一起正常工作。 如何正确格式化我的发布请求的数据?
"bar: {test: %s}"
不是一个有效的 json,尝试"{ "bar": {"test": "%s"} }"
(注意引号和括号),最好使用json.Marshal
。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.