Golang中REST请求体格式化的求助指南

Golang中REST请求体格式化的求助指南

	urlStr := "http://172.31.1.193/rt/REST/1.0/ticket/new?user=root&pass=asdasd"
	/*	resource := "/user/"


		u, _ := url.ParseRequestURI(apiUrl)
		u.Path = resource
	urlStr := u.String() // "https://api.com/user/"*/

	b := `content=id: ticket/new
	Queue: General
	Requestor: asd@asd.saaai
	Priority: 1
	Subject: asdasdd test 4
	Text: 12321321321321321321321321321321321321`

	fmt.Println(bytes.NewBufferString(b))
	fmt.Println(strconv.Itoa(len(b)))

	client := &http.Client{}
	r, _ := http.NewRequest("POST", urlStr, ioutil.NopCloser(bytes.NewBufferString(b))) // URL-encoded payload
	r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	r.Header.Add("Content-Length", strconv.Itoa(len(b)))

	resp, _ := client.Do(r)
	fmt.Println(resp)

问题在于另一端的服务器无法正确读取这些数据。通过Wireshark跟踪发现,Golang对每个换行符都格式化为\t\n,但当我通过curl发送请求时,只有\n。

使用curl时是这样的: 键:content 值:id: ticket/new\nQueue: General\nRequestor:someting@something

使用Go时是这样的: 键:content 值:id: ticket/new\t\nQueue: General\t\nRequest:something@something

如何格式化才能让Go发送时不带\t。

谢谢。


更多关于Golang中REST请求体格式化的求助指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

你在字符串中缩进了这些行,所以用于缩进的任何内容都会原样发送到另一端。移除字符串中的缩进应该就能解决问题。

更多关于Golang中REST请求体格式化的求助指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @miha

我不太确定你具体想要实现什么功能?能否提供一个你期望的输出示例,我可以试着帮你看看?

谢谢!

@BB-8@NobbZ 问好 🙂

好的,我将贴出能工作和不能工作的示例,因为我不知道问题出在哪里。我已经移除了制表符(\t),但结果相同。使用 curl 可以正常工作,但用 go 就无法让它工作。

能工作的示例: working

不能工作的示例: not_working

关于传输编码:分块传输怎么样?

同时附上我使用 curl 的方法:

curl --data-urlencode $'content="id: ticket/new\nQueue: General\nRequestor: [asdasd@asdds.si\nPriority](mailto:asd@asdads.si\nPriority): 1\nSubject: dasfrom command line\nText: tekst vrstica 1\n tekst vrstica 2\n tekst vrstica 3"' 'http://172.31.1.193/rt/REST/1.0/ticket/new?user=root&pass=asdasdas'

谢谢!

问题在于Go语言中反引号(raw string literal)定义的字符串会保留原始格式,包括制表符。当你在代码中使用反引号定义字符串时,其中的换行符会被保留为字面值,但在某些情况下可能被解释为\t\n(制表符+换行符),而服务器期望的是纯换行符\n

解决方案是使用双引号定义字符串,并显式使用\n作为换行符,避免使用制表符。以下是修正后的代码示例:

urlStr := "http://172.31.1.193/rt/REST/1.0/ticket/new?user=root&pass=asdasd"

b := "content=id: ticket/new\nQueue: General\nRequestor: asd@asd.saaai\nPriority: 1\nSubject: asdasdd test 4\nText: 12321321321321321321321321321321321321"

fmt.Println(bytes.NewBufferString(b))
fmt.Println(strconv.Itoa(len(b)))

client := &http.Client{}
r, _ := http.NewRequest("POST", urlStr, bytes.NewBufferString(b))
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
r.Header.Add("Content-Length", strconv.Itoa(len(b)))

resp, _ := client.Do(r)
fmt.Println(resp)

关键修改:

  • 将字符串定义从反引号改为双引号。
  • 在字符串中显式使用\n作为换行符,移除任何制表符。
  • 使用bytes.NewBufferString直接作为请求体,无需ioutil.NopCloser包装,因为bytes.Buffer已实现io.Reader接口。

这样生成的请求体将只包含\n换行符,与curl行为一致。

回到顶部