http - 如何在 POST 中的 JSON 中发送 JSON

标签 http go request

我正在尝试通过 POST 发送以下数据对 API 的 HTTP 请求:

{ 
   "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":""
   }
}

代码:
apiUrl := "http://example.com"
tr := &http.Transport{
    TLSClientConfig: &tls.Config{InsecureSkipVerify : true},
}

jsonStr := []byte(`{
        "client_interface": {
          "source_address": source,
          "destination_address": destn,
          "message": encrypted_msg,
          "business_event_url": settings.Message_CallbackURL
        },
        "server_interface": {
          "message_id": msg_id
        }
    }`)

req, err := http.NewRequest("POST", apiUrl, bytes.NewBuffer(jsonStr)) 
fmt.Println("req..........",req)
if err!=nil{
    log.Println("err in http req..............",err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("requestid", msg_id)
req.Header.Set("Authorization", "Bearer "+conn_token)
client := &http.Client{Transport: tr}
resp, err := client.Do(req)
if resp!=nil{
    body, _ := ioutil.ReadAll(resp.Body)
}

使用结构:
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 不会替换字符串中的变量。最好使用结构。

使用结构它不起作用,因为您从小写字母命名结构字段,这意味着 go 中的“私有(private)”字段。所以encoding/json包无法访问它们,只是跳过它们。使用大写首字母。

另一个修复是关于 'json:"tag"' - 这里的标签表示编码的字段名称,而不是类型。所以而不是'json:"string"'你应该使用 'json:"message_id"'或者。您可以像这样指定类型 'json:"field_name,type"'或像这样 'json:",type"'但是 encoding/json自己猜类型。

(由于 Markdown ,我在标签中使用了错误的引号)

我用了netcat -l 5000监听 localhost 上的 5000 端口并将所有内容打印到终端。然后我改了urlhttp://localhost:5000 (不是 https)向自己发送请求。
需要重启netcat每次上类。

而且我使日志记录更具可读性。

这也是 Go 中的 CamelCase 命名约定。

稍微改变了你的代码

package main

import (
    "bytes"
    "flag"
    "fmt"
    "io/ioutil"
    "net/http"

    //"crypto/tls"
    "encoding/json"

    "github.com/nikandfor/tlog"
)

type ClientInterface struct {
    SourceAddress      string `json:"source_address"`
    DestinationAddress uint64 `json:"destination_address"`
    Message            string `json:"message"`
    BusinessEventURL   string `json:"business_event_url"`
}
type ServerInterface struct {
    MessageID uint64 `json:"message_id"`
}
type Data struct {
    ClientInterface ClientInterface `json:"client_interface"`
    ServerInterface ServerInterface `json:"server_interface"`
}

var (
    // use command line flag. so run like so:
    // go run ./file.go -addr https://example.com
    addr = flag.String("addr", "http://localhost:5000", "address to send data to")
)

func main() {
    flag.Parse() // DO NOT FORGET TO PARSE FLAGS

    fmt.Println("URL:>", *addr)

    clientInterface := ClientInterface{
        SourceAddress:      "1",
        DestinationAddress: 8886121111,
        Message:            "khsjhdjks",
        BusinessEventURL:   "http://callbackurl-hdfc",
    }

    serverInterface := ServerInterface{
        MessageID: 8210993557215399651,
    }

    tlog.Printf("server_interface %+v", serverInterface)
    tlog.Printf("client_interface %+v", clientInterface)

    body1 := &Data{
        ClientInterface: clientInterface,
        ServerInterface: serverInterface,
    }
    tlog.Printf("body %+v", body1)
    t, err := json.Marshal(body1)
    if err != nil {
        panic(err)
    }
    tlog.Printf("marshalled: %s", t)

    req, err := http.NewRequest("POST", *addr, bytes.NewReader(t))
    tlog.Printf("req %v", 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)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    tlog.Printf("response Status: %v", resp.Status)
    tlog.Printf("response Headers: %v", resp.Header)
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    tlog.Printf("response Body: %s", 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}}

是你所期望的吗?

最后一个。我强烈建议您阅读https://golang.org/doc/effective_go.html

关于http - 如何在 POST 中的 JSON 中发送 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59247315/

相关文章:

go - 如何将真正属于 reflect.Int32 类型 slice 的 interface{} 转换为 int32 slice ?

mysql - SQL 请求被截断

php - 当出现一些依赖错误时,如何停止在 Laravel 中执行 Create 操作

ruby-on-rails - 在 Middleware Localhost 中获取客户端 IP

node.js - Angular 2 向 Node/Express 服务器端点发送请求

java - 关闭 StreamReader

amazon-web-services - aws-sdk-go 中的 Goroutine 泄漏?

testing - 什么是 Go 示例函数?

django - 在 Django 中测试自定义管理操作

http - 给定 Instagram 评论 ID,如何检索其原始媒体 ID?将计数传递给 http.call?