Golang中如何传递文本参数
Golang中如何传递文本参数 我正在尝试向 Golang 发送一个文本字符串。我找不到让它工作的方法。
这是我目前拥有的代码:
var j = `{"var":"test","id":10,"quant":1,"uid":1}`;
$.ajax({
url: "http://localhost:8080/display",
type: 'POST',
dataType: 'json',
contentType: "application/json; charset=utf-8",
//crossDomain: true,
data: "mydata=" + j,
success: function (result) {
func display1(w http.ResponseWriter, r *http.Request) {
err5 := r.ParseForm()
if err5 != nil {
fmt.Println(err5)
}
username := r.Form["var"][0]
fmt.Println(username)
我已经尝试了好几个小时,你能给我展示一个解决方案吗?
更多关于Golang中如何传递文本参数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢,但这会将 jQuery AJAX 调用中的内容类型默认设置为表单格式,而非 JSON。
更多关于Golang中如何传递文本参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
所以,我试着从你的角度理解,我想我明白了。contenttype 是 multipart/form-data,我正在解码 r.Body。现在一切正常,但我想知道,数据传输使用的是 JSON 吗?
非常感谢。
哦,我以为这是在用JSON进行保存和读取!如果只使用你的格式并更改内容类型,这个过程会变成JSON保存吗?还有,在我的例子中,使用JSON而不是HTML发送有什么意义呢?😊 实际上,我在想保存/读取是一种向Go传递大量数据的方式,你是这个意思吗?
JoshuaE:
这是使用JSON作为数据传输格式吗?
(“key”, “value”) 与JSON非常相似,但{“key”:“value”}才是JSON格式。许多记录应该以方括号开始和结束,并用逗号分隔。 [{“key”:“value”},{“key”:“value”}]
读取和保存为JSON则是另一回事了 
这个方法没有奏效,我只是想实现一个简单的POST请求,将JSON数据发送到Go后端并由其接收。我可以通过URL参数和GET请求让它工作,但我只想直接发送数据。这是因为数据长度超过了2000个字符。看起来有两个选项:decode和parseform(),但这并不是一个表单。网上所有的示例都不起作用,而且很少同时展示Ajax调用和Go代码。它们大多在Go代码中包含JSON,而不是从Ajax/JavaScript发送。
我也尝试过使用结构体…
我在JavaScript中这样做:
fetch("model", {
credentials: "include",
method: "POST",
headers:{
"Content-Type": "application/json"
},
body: JSON.stringify(payload)})
.then(response=>response.json())
.then(data => displayResponse(data));
Go服务端点定义了一个与预期负载结构匹配的结构体,并像这样解码请求体:
var postParameters struct {...}
if err := json.NewDecoder(req.Body).Decode(&postParameters); err != nil {
JoshuaE:
我只是在寻找一个简单的POST请求,将JSON发送到Go语言后端。
我在Stack Overflow上找到了这个。我理解这种方法是通过模拟一个网页表单,然后像处理表单数据一样提取数据…
发送JavaScript变量的值到Go变量
标签: javascript, go
提问者:Alin 于 06:18PM - 30 Aug 19 UTC
JoshuaE:
r.ParseForm()
这段代码暗示涉及一个HTML表单。键值对是通过表单提交的。否则,你就必须写入请求体并读取请求体。据我所知是这样。
在你的例子中,你或者使用了一个HTML表单,或者写入了请求体,但Go代码假设涉及一个HTML表单。
以下是如何在不使用表单的情况下发送表单数据的方法(原生JavaScript - 抱歉):
Edit fiddle - JSFiddle - Code Playground
在JSFiddle代码编辑器中在线测试你的JavaScript、CSS、HTML或CoffeeScript。
以下是我目前拥有的(一个有效的JSON GET请求)。我正在尝试进行一个JSON POST请求。我使用的是JQuery。
var members='{"var" : 10}';
var membersJSONString=JSON.stringify(members);
$.ajax({
url: "http://localhost:8080/display",
type: 'GET',
dataType: 'json',
contentType: "application/json; charset=utf-8",
crossDomain: true,
data: members,
processData: true,
success: function (result) {
func display1(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var body1 []byte
for key, _ := range r.Form {
body1 = []byte(key)
fmt.Println(body1)
fmt.Println(string(body1))
break
}
我正在尝试向 Go 发送一个文本字符串。
你是从网页发起 AJAX 调用并尝试将结果发送到 Go 吗?如果是这种情况,你可以“写入”请求体并从请求体中读取。
在浏览器中,你可以像 goForm 这样写入请求体:
htmltag.innerHTML = "text"
在 Go 中,你可以通过某种方式读取这个请求体,例如 https://goapi.go4webdev.org/client:
json.NewDecoder(resp.Body).Decode(&result)
如果你尝试“读取”一个网页表单,你可以使用“表单键”来获取值:
r.ParseForm()
mailfrom := r.FormValue("mail")
mailtype := r.FormValue("type")
我来这里是为了确认有人提到了 Fetch。有一个小注意事项是它不被 IE 支持。但大多数人不再需要担心 IE 了(谢天谢地)。
你的例子很接近。正如 Jeff 提到的,你需要正确地解码你的 JSON。以你正在发送的数据为例(我把 var 重命名为一个非关键字,所以 var 现在是 myNumber):
{"myNumber" : 10}
……并且你想像 Jeff 的例子那样使用 json.NewDecoder 来解码它。你需要一个结构体来解码数据。你可能被几件事卡住了。首先,假设你有一个这样的结构体:
// 用于解码 JSON 的结构体,与 javascript 代码对应
type postPayload struct {
myNumber int
}
乍一看,它可能看起来没问题。但是如果你尝试使用 json.NewDecoder 解码你的 json 会发生什么?它不会产生你想要的结果,因为 myNumber 是一个私有字段。我见过很多 Go 新手被这个问题卡住。如果你还没有看过,可以查看一下 gobyexample.com/json。
这里有一个可以在 Go Playground 上运行的、精心设计的可运行示例:
package main
import (
"encoding/json"
"fmt"
"strings"
)
type postPayload struct {
MyNumber int
}
func main() {
// 通过从包含 JSON 的字符串创建读取器来模拟请求体
r := strings.NewReader(`{"myNumber" : 10}`)
res := postPayload{}
// 这将是你的请求体 (r.Body)
json.NewDecoder(r).Decode(&res)
fmt.Println(res.MyNumber)
}
只要你在请求体中发送正确的 JSON,这段代码就能正常工作。然而,你可能还有一个不同的问题:你的 javascript 代码可能并没有完全按照你认为的方式运行。所以,你应该使用 Chrome(或你正在使用的任何浏览器)的开发工具来确保请求发送的负载与你认为的完全一致。你也可以使用像 postman 这样的工具进行测试。
在Golang中处理JSON文本参数的正确方式如下:
package main
import (
"encoding/json"
"fmt"
"net/http"
)
// 定义接收数据的结构体
type RequestData struct {
Var string `json:"var"`
ID int `json:"id"`
Quant int `json:"quant"`
UID int `json:"uid"`
}
func display1(w http.ResponseWriter, r *http.Request) {
// 检查请求方法
if r.Method != "POST" {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
// 设置响应头
w.Header().Set("Content-Type", "application/json")
// 解析JSON请求体
var data RequestData
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&data)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
defer r.Body.Close()
// 访问解析后的数据
fmt.Printf("Received var: %s\n", data.Var)
fmt.Printf("Received id: %d\n", data.ID)
fmt.Printf("Received quant: %d\n", data.Quant)
fmt.Printf("Received uid: %d\n", data.UID)
// 返回响应
response := map[string]interface{}{
"status": "success",
"message": "Data received",
"var": data.Var,
}
json.NewEncoder(w).Encode(response)
}
func main() {
http.HandleFunc("/display", display1)
http.ListenAndServe(":8080", nil)
}
同时需要修改前端代码,直接发送JSON对象而不是字符串拼接:
var j = {"var":"test","id":10,"quant":1,"uid":1};
$.ajax({
url: "http://localhost:8080/display",
type: 'POST',
dataType: 'json',
contentType: "application/json; charset=utf-8",
data: JSON.stringify(j), // 直接发送JSON对象
success: function (result) {
console.log(result);
},
error: function (xhr, status, error) {
console.error(error);
}
});
如果需要处理表单格式的参数(如原代码中的mydata=格式),可以使用以下方式:
func displayForm(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 获取表单中的mydata参数
mydata := r.FormValue("mydata")
if mydata == "" {
http.Error(w, "mydata parameter is required", http.StatusBadRequest)
return
}
// 解析JSON字符串
var data RequestData
err = json.Unmarshal([]byte(mydata), &data)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
fmt.Printf("Received var: %s\n", data.Var)
fmt.Printf("Received id: %d\n", data.ID)
w.Write([]byte("Data received successfully"))
}


