Http 如何在POST中发送JSON内部的JSON
我正试图通过Http 如何在POST中发送JSON内部的JSON,http,go,request,Http,Go,Request,我正试图通过POSTHTTP请求将以下数据发送到API: { "client_interface":{ "source_address":source, "destination_address":destn, "message":encrypted_msg, "business_event_url":settings.Message_CallbackURL }, "server_interface":{ "me
POST
HTTP请求将以下数据发送到API:
{
"client_interface":{
"source_address":source,
"destination_address":destn,
"message":encrypted_msg,
"business_event_url":settings.Message_CallbackURL
},
"server_interface":{
"message_id":msg_id
}
}
API正在响应,出现以下错误:
{
"Meta":{
"Requestid":12301343169471000
},
"Error":{
"Message":"Request body contains badly-formed JSON (at position 51)",
"Param":""
}
}
代码:
使用struct:
package main
import (
"fmt"
"net/http"
"io/ioutil"
"bytes"
//"crypto/tls"
"encoding/json"
)
type client_interface struct {
source_address string `json:"string"`
destination_address uint64 `json:"uint64"`
message string `json:"string"`
business_event_url string `json:"string"`
}
type server_interface struct {
message_id uint64 `json:"uint64"`
}
type data struct {
client_interface client_interface `json:"client_interface"`
server_interface server_interface `json:"server_interface"`
}
func main() {
url := "https://example.com"
fmt.Println("URL:>", url)
client_interface := client_interface{}
server_interface := server_interface{}
client_interface.source_address="1"
client_interface.destination_address=1111111111
client_interface.message="khsjhdjks"
client_interface.business_event_url="http://callbackurl-hdfc"
server_interface.message_id=8210993557215399651
fmt.Println("server_interface..........",server_interface)
fmt.Println("client_interface..........",client_interface)
body1 := &data{
client_interface: client_interface,
server_interface: server_interface,
}
fmt.Println("body1..........",body1)
t,e:=json.Marshal(body1)
fmt.Println("t..........",t)
fmt.Println("e..........",e)
req, err := http.NewRequest("POST", url, bytes.NewReader(t))
fmt.Println("req......",req)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("requestid", "8210993557215399651")
req.Header.Set("Authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkJCOENlRlZxeWFHckdOdWVoSklpTDRkZmp6dyIsImtpZCI6IkJCOENlRlZxeWFHckdOdWVoSklpTDRkZmp6dyJ9.eyJhdWQiOiJhcGk6Ly90cC1kZXYtdGFubGEtYXBpIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvY2JhYThhYmItZTcwZi00YmI4LWIwNDQtZmZiZjAwNzk0NzkwLyIsImlhdCI6MTU3NTg5MTI3NCwibmJmIjoxNTc1ODkxMjc0LCJleHAiOjE1NzU4OTUxNzQsImFjciI6IjEiLCJhaW8iOiI0MlZnWU9EY3JjenlhZXIxdkRMRDVlNHVtWUxha1UrRUplOVYrZGVlRFgrOTNUMytNRGNBIiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6IjFmMjI1N2ZlLWIzYjktNGQ2Ny05M2YyLWRjNjM2N2Q2MGM4MCIsImFwcGlkYWNyIjoiMCIsImlwYWRkciI6IjE0LjE0My4xODcuMjUwIiwibmFtZSI6ImhkZmMuMTEiLCJvaWQiOiIzOGQxMGFlNS01OGYyLTQ0NjUtYTFkOC04YTc0NDAzYjc5MmEiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiIzNDdUd0ZwYUw5MDhmOXlNRWlGOWNHMU84THFQYmJxZk45VzhyQWVEX1prIiwidGlkIjoiY2JhYThhYmItZTcwZi00YmI4LWIwNDQtZmZiZjAwNzk0NzkwIiwidW5pcXVlX25hbWUiOiJoZGZjLjExQFRhbmxhUHJvZHVjdC5vbm1pY3Jvc29mdC5jb20iLCJ1cG4iOiJoZGZjLjExQFRhbmxhUHJvZHVjdC5vbm1pY3Jvc29mdC5jb20iLCJ1dGkiOiJuS05TTXRsT3VFeXMtQjRIOGJ3TEFRIiwidmVyIjoiMS4wIn0.F5H9WCOktau3JaqNyWM91A5jFpJ9eJE99fBWvqDq9kOfCk3OCJnHFKXtIaIA7MoqbxWpNZt1yWpVKuw8gd2Lg_9nfUvvXts2DJHVQN0EqQmFUyWTzhdLW8ZVi6E9RtXK2aEWrI2TVceL5C2wbYOQYfvV4LzjTuNbs6k_20cQ0nD6oO1Id16VVFQWy9yKvpDzsTrvlQdFBZeohIfyL9XWKa8DOk0gxe4bjC7OFmuMsF3FZE5XPaQPHOJ3ejlZJiApml2TlRHnvLpkn1biE3NTAu9aO2lE262lyLg8ZaU0sbPuQaS8P797a-outxLvKEMh07895mA9g6vMxEdRV9X2eA")
client := &http.Client{}
resp, err := client.Do(req)
fmt.Println("err.............",err)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("response Status:", resp.Status)
fmt.Println("response Headers:", resp.Header)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("response Body:", string(body))
}
首先:请使用
gofmt
您的第一个代码无法工作,因为golang不能替换字符串中的变量。最好使用structs
对于structs,它不起作用,因为您将struct字段命名为小写形式,后者在go中表示“private”字段。所以encoding/json
包无法访问它们,只需跳过它们。使用大写的第一个字母
另一个修正是关于'json:“tag”
-这里tag表示编码字段名,而不是类型。因此,您应该使用“json:”字符串“
而不是“json:”消息id“
等等。您可以像这样指定类型'json:“field_name,type”
,或者像这样指定类型'json:,type”
,但是编码/json
自己猜测类型
(由于降价,我在标记中使用了错误的引号)
我使用netcat-l5000
监听本地主机上的5000端口,并将所有内容打印到终端。然后我将url
更改为http://localhost:5000
(非https)向我自己发送请求。
每次工作时都需要重新启动netcat
我让日志更具可读性
这也是go中的CamelCase命名约定
稍微更改了一下代码
主程序包
进口(
“字节”
“旗帜”
“fmt”
“io/ioutil”
“net/http”
//“加密/tls”
“编码/json”
“github.com/nikandfor/tlog”
)
类型ClientInterface结构{
SourceAddress字符串`json:“源地址”`
DestinationAddress uint64`json:“目的地地址”`
消息字符串`json:“消息”`
BusinessEventURL字符串`json:“business\u event\u url”`
}
类型服务器接口结构{
MessageID uint64`json:“message_id”`
}
类型数据结构{
ClientInterface ClientInterface`json:“客户端接口”`
ServerInterface ServerInterface`json:“服务器接口”`
}
变量(
//使用命令行标志。请按如下方式运行:
//转到run./file.go-addrhttps://example.com
addr=flag.String(“addr”http://localhost:5000“,“发送数据的地址”)
)
func main(){
flag.Parse()//不要忘记分析标志
fmt.Println(“URL:>”,*addr)
clientInterface:=clientInterface{
来源地址:“1”,
目的地地址:8886121111,
信息:“khsjhdjks”,
BusinessEventURL:“http://callbackurl-hdfc",
}
serverInterface:=服务器接口{
MessageID:8210993557215399651,
}
Printf(“服务器接口%+v”,服务器接口)
tlog.Printf(“客户端接口%+v”,客户端接口)
正文1:=&数据{
ClientInterface:ClientInterface,
ServerInterface:ServerInterface,
}
tlog.Printf(“主体%+v”,主体1)
t、 err:=json.Marshal(body1)
如果错误!=零{
恐慌(错误)
}
Printf(“封送:%s”,t)
req,err:=http.NewRequest(“POST”,*addr,bytes.NewReader(t))
tlog.Printf(“请求%v”,请求)
req.Header.Set(“内容类型”、“应用程序/json”)
请求头集合(“请求ID”,“8210993557215399651”)
请求头集合(“授权”,"持票人EYJJ0Exhioijkv1QijIjSuzi1Niising1dCI6IkCoenlzXeHckdwVosklPdRkZmPdDyIkJ6IkCdJ9。EYJHdWqHcGk6Y90CC1KxyTdGfUbPiiWiaxiZiZiZiZiZiJr0HmZyZyZyZyZyZyZyZyZyZyZyZyZyZyZyZmZmZiZiZiZiZiZiZiZiZiZiZiZiZiZiZ3Nj3NdZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiZiIi6Ijeilcjhaw8Ii6Ijjjlznwu9Ey3JjenlhzxDkrdvlnhvwuxha1rruplovyrzgvlrfgrotnumywywywyjjjjjjjjdjdjlzlwwwwyjjjjwjjjwjjlwzlwyzyjjjzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyzyz第二部分是第二部分,第二部分是第二部分,第二部分是第二部分,第二部分是第二部分,第二部分是第二部分,第二部分是第二部分,第二部分是第二部分,第二部分是第二部分,第二部分是第二部分,第二部分是第二部分是第二部分,第二部分是第二部分是第二部分,第二部分是第二部分是第二部分,第二部分是第二部分是第二部分,第二部分是第二部分是第二部分是第二部分,第二部分是第二部分是第二部分是第二部分,第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分,第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分是第二部分,第二部分,第Wvqdq9Kofck3OcjHfk2Ia7MoqbxWpNzT1ywPvkuw8Gd2Lg9NfVxTs2DjHvqn0EqqmFuyTzHd8Zvi6E9Rtx2Aewr2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2Tc2c2Tc2c2c2Tc2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2
客户端:=&http.client{}
resp,err:=client.Do(请求)
如果错误!=零{
恐慌(错误)
}
延迟响应主体关闭()
tlog.Printf(“响应状态:%v”,响应状态)
Printf(“响应头:%v”,响应头)
body,err:=ioutil.ReadAll(resp.body)
如果错误!=零{
恐慌(错误)
}
Printf(“响应正文:%s”,字符串(正文))
}
这是你所期望的吗
最后一点。我强烈建议您阅读json中的所有值都缺少引号。它应该是
“源地址”:“源”
,等等。而不是“源地址”“:source
。。。。尽管看起来有点像是在试图引用原始字符串中的实际变量,但这在Go中是不可能的。相反,您应该声明一个结构类型,其结构与json的结构等效,初始化它并将字段设置为所需的值,然后使用encoding/json
包封送该结构实例。。但我得到的错误是502个坏网关常量值或变量,这无关紧要,在字符串中使用Go标识符不会自动将它们的值插入字符串中。如果你想自己造线哟
package main
import (
"fmt"
"net/http"
"io/ioutil"
"bytes"
//"crypto/tls"
"encoding/json"
)
type client_interface struct {
source_address string `json:"string"`
destination_address uint64 `json:"uint64"`
message string `json:"string"`
business_event_url string `json:"string"`
}
type server_interface struct {
message_id uint64 `json:"uint64"`
}
type data struct {
client_interface client_interface `json:"client_interface"`
server_interface server_interface `json:"server_interface"`
}
func main() {
url := "https://example.com"
fmt.Println("URL:>", url)
client_interface := client_interface{}
server_interface := server_interface{}
client_interface.source_address="1"
client_interface.destination_address=1111111111
client_interface.message="khsjhdjks"
client_interface.business_event_url="http://callbackurl-hdfc"
server_interface.message_id=8210993557215399651
fmt.Println("server_interface..........",server_interface)
fmt.Println("client_interface..........",client_interface)
body1 := &data{
client_interface: client_interface,
server_interface: server_interface,
}
fmt.Println("body1..........",body1)
t,e:=json.Marshal(body1)
fmt.Println("t..........",t)
fmt.Println("e..........",e)
req, err := http.NewRequest("POST", url, bytes.NewReader(t))
fmt.Println("req......",req)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("requestid", "8210993557215399651")
req.Header.Set("Authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkJCOENlRlZxeWFHckdOdWVoSklpTDRkZmp6dyIsImtpZCI6IkJCOENlRlZxeWFHckdOdWVoSklpTDRkZmp6dyJ9.eyJhdWQiOiJhcGk6Ly90cC1kZXYtdGFubGEtYXBpIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvY2JhYThhYmItZTcwZi00YmI4LWIwNDQtZmZiZjAwNzk0NzkwLyIsImlhdCI6MTU3NTg5MTI3NCwibmJmIjoxNTc1ODkxMjc0LCJleHAiOjE1NzU4OTUxNzQsImFjciI6IjEiLCJhaW8iOiI0MlZnWU9EY3JjenlhZXIxdkRMRDVlNHVtWUxha1UrRUplOVYrZGVlRFgrOTNUMytNRGNBIiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6IjFmMjI1N2ZlLWIzYjktNGQ2Ny05M2YyLWRjNjM2N2Q2MGM4MCIsImFwcGlkYWNyIjoiMCIsImlwYWRkciI6IjE0LjE0My4xODcuMjUwIiwibmFtZSI6ImhkZmMuMTEiLCJvaWQiOiIzOGQxMGFlNS01OGYyLTQ0NjUtYTFkOC04YTc0NDAzYjc5MmEiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiIzNDdUd0ZwYUw5MDhmOXlNRWlGOWNHMU84THFQYmJxZk45VzhyQWVEX1prIiwidGlkIjoiY2JhYThhYmItZTcwZi00YmI4LWIwNDQtZmZiZjAwNzk0NzkwIiwidW5pcXVlX25hbWUiOiJoZGZjLjExQFRhbmxhUHJvZHVjdC5vbm1pY3Jvc29mdC5jb20iLCJ1cG4iOiJoZGZjLjExQFRhbmxhUHJvZHVjdC5vbm1pY3Jvc29mdC5jb20iLCJ1dGkiOiJuS05TTXRsT3VFeXMtQjRIOGJ3TEFRIiwidmVyIjoiMS4wIn0.F5H9WCOktau3JaqNyWM91A5jFpJ9eJE99fBWvqDq9kOfCk3OCJnHFKXtIaIA7MoqbxWpNZt1yWpVKuw8gd2Lg_9nfUvvXts2DJHVQN0EqQmFUyWTzhdLW8ZVi6E9RtXK2aEWrI2TVceL5C2wbYOQYfvV4LzjTuNbs6k_20cQ0nD6oO1Id16VVFQWy9yKvpDzsTrvlQdFBZeohIfyL9XWKa8DOk0gxe4bjC7OFmuMsF3FZE5XPaQPHOJ3ejlZJiApml2TlRHnvLpkn1biE3NTAu9aO2lE262lyLg8ZaU0sbPuQaS8P797a-outxLvKEMh07895mA9g6vMxEdRV9X2eA")
client := &http.Client{}
resp, err := client.Do(req)
fmt.Println("err.............",err)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("response Status:", resp.Status)
fmt.Println("response Headers:", resp.Header)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("response Body:", string(body))
}
$ nc -l 5000
POST / HTTP/1.1
Host: localhost:5000
User-Agent: Go-http-client/1.1
Content-Length: 92
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkJCOENlRlZxeWFHckdOdWVoSklpTDRkZmp6dyIsImtpZCI6IkJCOENlRlZxeWFHckdOdWVoSklpTDRkZmp6dyJ9.eyJhdWQiOiJhcGk6Ly90cC1kZXYtdGFubGEtYXBpIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvY2JhYThhYmItZTcwZi00YmI4LWIwNDQtZmZiZjAwNzk0NzkwLyIsImlhdCI6MTU3NTg5MTI3NCwibmJmIjoxNTc1ODkxMjc0LCJleHAiOjE1NzU4OTUxNzQsImFjciI6IjEiLCJhaW8iOiI0MlZnWU9EY3JjenlhZXIxdkRMRDVlNHVtWUxha1UrRUplOVYrZGVlRFgrOTNUMytNRGNBIiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6IjFmMjI1N2ZlLWIzYjktNGQ2Ny05M2YyLWRjNjM2N2Q2MGM4MCIsImFwcGlkYWNyIjoiMCIsImlwYWRkciI6IjE0LjE0My4xODcuMjUwIiwibmFtZSI6ImhkZmMuMTEiLCJvaWQiOiIzOGQxMGFlNS01OGYyLTQ0NjUtYTFkOC04YTc0NDAzYjc5MmEiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJzdWIiOiIzNDdUd0ZwYUw5MDhmOXlNRWlGOWNHMU84THFQYmJxZk45VzhyQWVEX1prIiwidGlkIjoiY2JhYThhYmItZTcwZi00YmI4LWIwNDQtZmZiZjAwNzk0NzkwIiwidW5pcXVlX25hbWUiOiJoZGZjLjExQFRhbmxhUHJvZHVjdC5vbm1pY3Jvc29mdC5jb20iLCJ1cG4iOiJoZGZjLjExQFRhbmxhUHJvZHVjdC5vbm1pY3Jvc29mdC5jb20iLCJ1dGkiOiJuS05TTXRsT3VFeXMtQjRIOGJ3TEFRIiwidmVyIjoiMS4wIn0.F5H9WCOktau3JaqNyWM91A5jFpJ9eJE99fBWvqDq9kOfCk3OCJnHFKXtIaIA7MoqbxWpNZt1yWpVKuw8gd2Lg_9nfUvvXts2DJHVQN0EqQmFUyWTzhdLW8ZVi6E9RtXK2aEWrI2TVceL5C2wbYOQYfvV4LzjTuNbs6k_20cQ0nD6oO1Id16VVFQWy9yKvpDzsTrvlQdFBZeohIfyL9XWKa8DOk0gxe4bjC7OFmuMsF3FZE5XPaQPHOJ3ejlZJiApml2TlRHnvLpkn1biE3NTAu9aO2lE262lyLg8ZaU0sbPuQaS8P797a-outxLvKEMh07895mA9g6vMxEdRV9X2eA
Content-Type: application/json
Requestid: 8210993557215399651
Accept-Encoding: gzip
{"client_interface":{"source_address":"1","destination_address":8886121111,"message":"khsjhdjks","business_event_url":"http://callbackurl-hdfc"},"server_interface":{"message_id":8210993557215399651}}