我在Go中编写了一个简单的客户端/服务器,它将通过TLS进行HTTP GET,但我也试图让它能够通过TLS进行HTTP POST。
在下面的示例中,index.html
只包含文本hello
,并且HTTP GET正常运行。我希望客户端获取HTTP GET并将hello world
写回服务器。
客户端
package main
import (
"crypto/tls"
"fmt"
"io/ioutil"
"net/http"
"strings"
)
func main() {
link := "https://10.0.0.1/static/index.html"
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
response, err := client.Get(link)
if err != nil {
fmt.Println(err)
}
defer response.Body.Close()
content, _ := ioutil.ReadAll(response.Body)
s := strings.TrimSpace(string(content))
fmt.Println(s)
// out := s + " world"
// Not working POST...
// resp, err := client.Post(link, "text/plain", &out)
}
服务器
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/static/", func (w http.ResponseWriter, r *http.Request) {
fmt.Println("Got connection!")
http.ServeFile(w, r, r.URL.Path[1:])
})
log.Fatal(http.ListenAndServeTLS(":443", "server.crt", "server.key", nil))
}
我目前还没有处理服务器端的POST,但我只是想将它打印到屏幕上,所以当我运行客户端时,我会看到服务器打印hello world
。
如何修复客户端代码以进行正确的POST?相应的服务器代码应该接受什么样的POST呢?任何帮助将不胜感激,我找不到HTTPS / TLS POST示例。
答案 0 :(得分:2)
您没有分享错误消息,但我认为client.Post
调用不允许将字符串作为其第三个参数,因为它需要io.Reader
。试试这个:
out := s + " world"
resp, err := client.Post(link, "text/plain", bytes.NewBufferString(out))
在服务器端,您已经设置了正确的代码来处理POST请求。只需检查方法:
http.HandleFunc("/static/", func (w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
// handle POST requests
} else {
// handle all other requests
}
})
我注意到另一个问题。使用index.html
可能不会在这里工作。 http.ServeFile
将重定向该路径。见https://golang.org/pkg/net/http/#ServeFile:
作为一种特殊情况,ServeFile会重定向r.URL.Path中的任何请求 结束于" /index.html"走向同一条道路,没有决赛 "的index.html&#34 ;.要避免此类重定向,请修改路径或使用 ServeContent。
我建议只使用不同的文件名来避免这个问题。