Golang POST-запрос в формате JSON из файла csv - PullRequest
0 голосов
/ 20 июня 2020

, поэтому я пытаюсь отправить CSV-файл в формате JSON на веб-сайт в Golang. Я успешно отправил на POST единственный файл JSON. Однако цель моей программы - не в этом. В основном я пытаюсь создать генератор учетных записей для сайта. Я хочу иметь возможность создавать сразу несколько учетных записей. Я считаю, что лучший способ сделать это - использовать файл csv.

Я пробовал использовать кодировку / csv для чтения файла csv, а затем маршалировать его до JSON. Также ioutil.ReadFile(). Однако ответ с сайта: «Имя является обязательным полем, фамилия - обязательным полем» et c et c. Таким образом, это, очевидно, означает, что данные csv не входят в формат JSON. Я покажу свой код с помощью ioutil.ReadFile () ниже.

func main() {
file, _ := ioutil.ReadFile("accounts.csv")

    jsonConv, _ := json.Marshal(file)

    client := http.Client{}

    req, err := http.NewRequest("POST", "websiteUrlHere", bytes.NewBuffer(jsonConv))
    req.Header.Add("cookie", `"really long cookie goes here"`)
    req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36")
    req.Header.Set("content-type", "application/json")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Print(err)
    }
    defer resp.Body.Close()
}

(^ Это всего лишь фрагмент кода).

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

Надеюсь, вышеизложенного достаточно. Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Проблема с вашим кодом на самом деле заключается в том, что вы пытаетесь преобразовать файл в байты с помощью:

file, _ := ioutil.ReadFile("accounts.csv")

..., а затем вы СНОВА пытаетесь преобразовать этот фрагмент байтов в JSON байты с:

jsonConv, _ := json.Marshal(file)

Где текстовое содержимое файла сохраняется в виде фрагмента байтов в переменной file, а затем этот фрагмент байтов (содержимое файла в байтовой форме) затем преобразуется в массив JSON байтов. Таким образом, вы в основном отправляете массив JSON чисел ... нехорошо.

Нормальный поток здесь будет заключаться в том, чтобы взять file байтов, а затем создать Go структуры из Это. Как только ваши Go объекты будут на месте, ТОГДА вы должны перейти к JSON. Это преобразует объекты Go в фрагмент байтов ПОСЛЕ того, как они были преобразованы в текстовую форму JSON.

Итак, вам не хватает среднего шага структуры Go, но вы также должны помнить что преобразование структуры Go в JSON байтов с помощью json.Marshal() будет отображать только экспортированные поля. Кроме того, обычно вы должны использовать структурные теги, чтобы точно настроить, как будут отображаться поля.

Лучше всего придерживаться JSON, забудьте о CSV. В вашем собственном примере кода вы берете CSV, а затем пытаетесь преобразовать его в JSON ... так что просто используйте JSON.

Если вы хотите отправить несколько учетных записей, просто сделайте ваш Go структурирует срез, который будет упорядочен в массив JSON, что в основном вы и пытаетесь сделать. Конечным результатом будет массив учетных записей JSON. Вот простой пример:

package main

import (
    "fmt"
    "encoding/json"
)

type Account struct {
    Username string `json:"username"`
    Email string `json:"email"`
}

type AccountsRequest struct {
    Accounts []Account `json:"accounts"`
}

func main() {
    //gather account info
    acct1 := Account{Username: "tom", Email: "tom@example.com"}
    acct2 := Account{Username: "dick", Email: "dick@example.com"}
    acct3 := Account{Username: "harry", Email: "harry@example.com"}
    
    //create request
    acctsReq := AccountsRequest{Accounts: []Account{acct1, acct2, acct3}}
    
    //convert to JSON bytes/data
    //jsonData, _ := json.Marshal(acctsReq)
    
    //debug/output
    jsonDataPretty, _ := json.MarshalIndent(acctsReq, "", "  ")
    fmt.Println(string(jsonDataPretty))
    
    //send request with data
    //...
}

Runnable здесь на игровой площадке.

Ключ в том, что структуры настроены и готовы к go и тегам struct определите, какими будут имена полей JSON (т.е. username & email для каждой учетной записи и accounts для всего массива учетных записей).

Надеюсь, что это поможет. Напишите комментарий, если вам нужна дополнительная информация c помощь.

1 голос
/ 21 июня 2020

Вам необходимо сначала проанализировать CSV-файл и преобразовать его в нужный список:

package main


func main() {
   file, err := os.Open("file.csv")
   if err != nil {
      log.Fatal("failed opening file because: %s", err.Error())
   }
   r := csv.NewReader(file)

   records, err := r.ReadAll()
   if err != nil {
      log.Fatal(err)
   }
   fmt.Print(records)
}

Приведенный выше код анализирует список в массив строк [] []. теперь вам нужно будет перебрать этот массив и превратить его в объект json, который нужен странице. Тогда вы можете его отправить. Вы можете узнать больше о пакете csv здесь: https://golang.org/pkg/encoding/csv/

Совет: никогда не игнорируйте ошибки, они могут дать вам полезную информацию.

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