如何获取请求消息体内容?

huangapple go评论90阅读模式
英文:

go - How to get request message body content?

问题

在Go语言中,你可以使用net/http包来读取请求消息体中的数据。以下是在Go中获取请求消息体中数据的示例代码:

import (
	"io/ioutil"
	"net/http"
)

func YourHandler(w http.ResponseWriter, r *http.Request) {
	// 设置响应头,允许跨域请求
	w.Header().Set("Access-Control-Allow-Origin", "*")
	w.Header().Set("Access-Control-Allow-Methods", "POST")
	w.Header().Set("Access-Control-Allow-Headers", "Content-Type")

	// 读取请求消息体中的数据
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		// 处理读取错误
	}

	// 解析请求消息体中的数据
	// 这里假设请求消息体是JSON格式的数据
	type RequestData struct {
		URL string `json:"url"`
	}

	var requestData RequestData
	err = json.Unmarshal(body, &requestData)
	if err != nil {
		// 处理解析错误
	}

	// 获取URL字段的值
	url := requestData.URL

	// 后续处理
}

你可以将上述代码中的YourHandler函数作为处理请求的处理器函数,然后将其注册到你的路由中。这样,当有请求发送到该路由时,就会执行YourHandler函数,并从请求消息体中读取数据。请根据你的实际需求进行相应的修改和处理。

英文:

My client code sends an AJAX request to server, containing a message

How could I read data from that request message body. In Express of NodeJS, I use this:

    app.post('/api/on', auth.isLoggedIn, function(req, res){
    			res.setHeader('Access-Control-Allow-Origin', '*');
    		    res.setHeader('Access-Control-Allow-Methods', 'POST');
    		    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    
    		    var url = req.body.url;
                // Later process
}

What is the url = req.body.url equivalent in Go?

答案1

得分: 2

如果请求体是URL编码的,则使用r.FormValue("url")从请求中获取"url"的值。

如果请求体是JSON格式的,则使用JSON解码器将请求体解析为与JSON形状匹配的值。

var data struct {
   URL string
}
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
    // 处理错误
}
// data.URL 是发布的JSON对象的"url"成员。
英文:

If the request body is URL encoded, then use r.FormValue("url") to get the "url" value from the request.

If the request body is JSON, then use the JSON decoder to parse the request body to a value typed to match the shape of the JSON.

var data struct {
   URL string
}
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
    // handle error
}
// data.URL is "url" member of the posted JSON object.

答案2

得分: 1

这是一个简单的HTTP处理程序的示例:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	http.HandleFunc("/", Handler)
	http.ListenAndServe(":8080", nil)
	// 在playground中运行会失败,但这将在本地启动一个服务器
}

type Payload struct {
	ArbitraryValue string `json:"arbitrary"`
	AnotherInt     int    `json:"another"`
}

func Handler(w http.ResponseWriter, r *http.Request) {
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	url := r.URL
	// 处理请求URL
	fmt.Fprintf(w, "URL是 %q", url)

	payload := Payload{}
	err = json.NewDecoder(bytes.NewReader(body)).Decode(&payload)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	// 处理payload
}

你可以在这里找到完整的代码示例。

英文:

Here is a simple example of an http handler:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	http.HandleFunc("/", Handler)
	http.ListenAndServe(":8080", nil)
	// Running in playground will fail but this will start a server locally
}

type Payload struct {
	ArbitraryValue string `json:"arbitrary"`
	AnotherInt     int    `json:"another"`
}

func Handler(w http.ResponseWriter, r *http.Request) {
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	url := r.URL
	// Do something with Request URL
	fmt.Fprintf(w, "The URL is %q", url)

	payload := Payload{}
	err = json.NewDecoder(bytes.NewReader(body)).Decode(&payload)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	// Do something with payload

}

huangapple
  • 本文由 发表于 2016年3月31日 02:01:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/36316318.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定