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

13 回复

感谢,但这会将 jQuery AJAX 调用中的内容类型默认设置为表单格式,而非 JSON。

更多关于Golang中如何传递文本参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


所以,我试着从你的角度理解,我想我明白了。contenttypemultipart/form-data,我正在解码 r.Body。现在一切正常,但我想知道,数据传输使用的是 JSON 吗?

非常感谢。

哦,我以为这是在用JSON进行保存和读取!如果只使用你的格式并更改内容类型,这个过程会变成JSON保存吗?还有,在我的例子中,使用JSON而不是HTML发送有什么意义呢?😊 实际上,我在想保存/读取是一种向Go传递大量数据的方式,你是这个意思吗?

JoshuaE:

这是使用JSON作为数据传输格式吗?

(“key”, “value”) 与JSON非常相似,但{“key”:“value”}才是JSON格式。许多记录应该以方括号开始和结束,并用逗号分隔。 [{“key”:“value”},{“key”:“value”}]

读取和保存为JSON则是另一回事了 :slight_smile:

这个方法没有奏效,我只是想实现一个简单的POST请求,将JSON数据发送到Go后端并由其接收。我可以通过URL参数和GET请求让它工作,但我只想直接发送数据。这是因为数据长度超过了2000个字符。看起来有两个选项:decodeparseform(),但这并不是一个表单。网上所有的示例都不起作用,而且很少同时展示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上找到了这个。我理解这种方法是通过模拟一个网页表单,然后像处理表单数据一样提取数据…

stackoverflow.com

发送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")

首先,请确保在发送POST请求时,您的函数能够接收到JSON数据。为此,我们只需将接收到的数据打印到控制台。

func display1(w http.ResponseWriter, r *http.Request) {
    // 将接收到的所有数据读入 s,s 的类型为 []byte
    s, err := ioutil.ReadAll(r.Body)
    if err != nil {
        panic(err)
    }
    // 将 s 的内容打印到控制台(标准输出)
    fmt.Println(string(s))
}

如果您看到了预期的JSON文本,我们就可以进行第二步,即解码JSON数据。

type myData 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) {
    // 将接收到的所有数据读入 s,s 的类型为 []byte
    s, err := ioutil.ReadAll(r.Body)
    if err != nil {
        panic(err)
    }

    // 解码接收到的 JSON 数据
    var data myData
    if err := json.Unmarshal(s, &data); err != nil {
        panic(err)
    }
    // 将数据打印到控制台
    fmt.Printf("%+v\n", data)
}

当使用此ajax函数进行POST请求时,您发送的不是表单。请求数据是JSON编码。这就是为什么我们通过简单地从 r.Body 读取所有数据来获取JSON数据。

我来这里是为了确认有人提到了 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"))
}
回到顶部