登录
首页 >  Golang >  Go问答

golang - tcpclient发送http请求时遇到错误请求400

来源:stackoverflow

时间:2024-02-27 08:15:24 212浏览 收藏

哈喽!今天心血来潮给大家带来了《golang - tcpclient发送http请求时遇到错误请求400》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我试图通过golang中的tcp/tls套接字发送http请求,但是当我尝试发送它时,无论主机是什么,它总是返回(错误请求400),所以我认为它一定是我通过 tcp/tls 发送请求的方式出了问题,我进行了搜索,并寻找一种方法来做我想做的事情,但没有结果:

package main

import (
"crypto/rand"
"crypto/tls"
"fmt"
"net"
"strings"
)

func main() {

headers := make(map[string]string)

headers["Accept"] = "application/json"
request := parseRequest("httpbin.org", "/get", "get", headers, nil, "")
println(request)

tcpConn, err := net.Dial("tcp", "httpbin.org:443")
if err != nil {
    panic(err)
}
cf := &tls.Config{Rand: rand.Reader, InsecureSkipVerify: true}
ssl := tls.Client(tcpConn, cf)

if err != nil {
    panic(err)
}
defer ssl.Close()

n, err := ssl.Write([]byte(request))

if err != nil {
    fmt.Println(n, err)
    return
}

buf := make([]byte, 1024)
n, err = ssl.Read(buf)
if err != nil {
    fmt.Println(n, err)
    return
}

println(string(buf[:n]))

}

func parseRequest(host string, path string, method string, headers map[string]string, data map[string]string, rawData string) string {

method = strings.ToUpper(method)
rawRequest := fmt.Sprintf(`%s %s HTTP/1.1\r\n`, strings.ToUpper(method), path)

if method == `GET` && (data != nil || rawData != ``) {
    var rawQuery string
    if rawData != `` {
        rawQuery = rawData
    } else {
        i := 0
        for key, value := range data {
            if i == len(data)-1 {
                rawQuery += fmt.Sprintf(`%s=%s`, key, value)
            } else {
                rawQuery += fmt.Sprintf(`%s=%s&`, key, value)
            }
            i++
        }
    }
    query := fmt.Sprintf(`%s?%s`, path, rawQuery)
    rawRequest = fmt.Sprintf(`%s %s HTTP/1.1\r\n`, strings.ToUpper(method), query)
}

var rawHeaders string
for key, value := range headers {
    rawHeaders += fmt.Sprintf(`%s: %s\r\n`, key, value)
}

if !strings.Contains(strings.ToLower(rawHeaders), `host`) {
    rawRequest += fmt.Sprintf(`Host: %s\r\n`, host)
}
rawRequest += fmt.Sprintf(`%s\r\n`, rawHeaders)

if method == `POST` && (data != nil || rawData != ``) {

    if rawData != `` {
        rawRequest += rawData
    } else {
        i := 0
        for key, value := range data {
            if i == len(data)-1 {
                rawRequest += fmt.Sprintf(`%s=%s`, key, value)
            } else {
                rawRequest += fmt.Sprintf(`%s=%s&`, key, value)
            }
            i++
        }
    }

}

return rawRequest
}

解决方案


在 Go 中,反引号 ` 用于表示原始字符串,如 spec 所示:

原始字符串文字是反引号之间的字符序列,如 `foo`。引号内可以出现除反引号之外的任何字符。 原始字符串文字的值是由以下内容组成的字符串 之间的未解释(隐式 UTF-8 编码)字符 引号;特别是,反斜杠没有特殊含义,并且 字符串可能包含换行符。里面有回车符('\r') 原始字符串文字将从原始字符串值中丢弃。

这意味着,代码中的所有 \r\n 不会被解释为回车符或换行符。您应该更改为使用双引号 "

作为一般风格指南,除非需要大量转义,否则应该使用双引号。

好了,本文到此结束,带大家了解了《golang - tcpclient发送http请求时遇到错误请求400》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>