Как отправить новый запрос с объектом вместо байтов? - PullRequest
0 голосов
/ 25 сентября 2018

Мне нужно отправить объект данных, например, {hello: "world", goodbye: "world"} в API.Я делаю это прямо сейчас:

inputs := form.GetElementsByTagName("input")

var data = make(map[string]interface{}) // after adding values this looks like this: {hello: "world", goodbye: "world"}

for value := range inputs {
    // Append all values from the inputs to a new array, with the key named by the input name attribute
    if inputs[value] != nil && inputs[value].(*dom.HTMLInputElement).Value != "" {
        data[inputs[value].(*dom.HTMLInputElement).Name] = inputs[value].(*dom.HTMLInputElement).Value
    }
}

parsedData, _ := json.Marshal(data)
req, _ := http.NewRequest(method, url, bytes.NewBuffer(parsedData))

req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

client := &http.Client{}
go func() { // Must be a goroutine
    response, _ := client.Do(req)
    defer response.Body.Close()
}()

Проблема, с которой я столкнулся, заключается в том, что, поскольку мы отправляем его в виде байта, сервер всегда возвращает сообщения об ошибках, поскольку он ожидает обработки объекта.

Как я могу убедиться, что он отправляет объект вместо байтов?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я решил это с помощью пакета "net/url".

data := url.Values{}

for value := range inputs {
    // Append all values from the inputs to a new array, with the key named by the input name attribute
    if inputs[value] != nil && inputs[value].(*dom.HTMLInputElement).Value != "" {
        data.Add(inputs[value].(*dom.HTMLInputElement).Name, inputs[value].(*dom.HTMLInputElement).Value)
    }
}

req, _ := http.NewRequest(method, actionUrl, strings.NewReader(data.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
0 голосов
/ 25 сентября 2018

Вы устанавливаете тип контента на application/x-www-form-urlencoded во время отправки данных в формате json, поэтому измените тип контента при настройке заголовков запроса, а также не пропускайте ошибку, чтобы проверить, что это за ошибка.:

parsedData, err := json.Marshal(data)
if err != nil{
    fmt.Println(err)
}
req, err := http.NewRequest(method, url, parsedData) // send the parseData which are bytes returned from the marshal.
if err != nil{
    fmt.Println(err)
}
req.Header.Set("Content-Type", "application/json") // set the content type to json

go func() { // Must be a goroutine
    response, err := client.Do(req)
    if err != nil{
        fmt.Println(err)
    }
    defer response.Body.Close()
}()

// you should check for response status to verify the details as
fmt.Println("response Status:", response.Status)
fmt.Println("response Headers:", response.Header)
body, _ := ioutil.ReadAll(response.Body)
fmt.Println("response Body:", string(body))

Одна вещь, которую следует учитывать, это то, что вы не экспортировали свои поля структуры.Это может быть причиной того, что ваша строка JSON становится пустой.Сделайте ваши поля структуры экспортируемыми, сделав их первую букву каждого поля заглавными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...