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
你在字符串中缩进了这些行,所以用于缩进的任何内容都会原样发送到另一端。移除字符串中的缩进应该就能解决问题。
更多关于Golang中REST请求体格式化的求助指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
好的,我将贴出能工作和不能工作的示例,因为我不知道问题出在哪里。我已经移除了制表符(\t),但结果相同。使用 curl 可以正常工作,但用 go 就无法让它工作。
能工作的示例:

不能工作的示例:

关于传输编码:分块传输怎么样?
同时附上我使用 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行为一致。

