#go
#Вперед
Вопрос:
Как я могу правильно получить сообщение в формате JSON после отправки формы с помощью Golang? Сегодня я впервые пробую Golang.
Вот чего я пытаюсь достичь: например, в PHP я могу повторить / распечатать сообщение в формате JSON после того, как пользователь отправил форму, и затем могу получить к нему доступ из интерфейса.
Например.
if($everything == 'ok'){
$messages = [
'message' => 'User Registered successfully'
];
echo json_encode($messages);
exit();
}
Как мне сделать это с Golang?
Приведенный ниже код отлично работает, вставляя записи в базу данных. После успешной вставки в приведенном ниже коде отображается сообщение об успешном завершении, и все работает нормально.
res.Write([]byte("User Registered successfully!" username))
Как мне получить JSON-ответ об успешном сообщении, чтобы я мог получить к нему доступ из моего интерфейса, как в приведенном выше коде PHP?
Я пытался:
messageJson := `{"message": "User Registered successfully"}`
jsonresult_send := json.Marshal(messageJson)
return jsonresult_send
Но он отображает ошибку, слишком много аргументов для возврата.
Вот весь код:
package main
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
import "net/http"
import "fmt"
import "encoding/json"
var db *sql.DB
var err error
type MessageInfo struct {
Message string
}
func signupPage(res http.ResponseWriter, req *http.Request) {
if req.Method != "POST" {
http.ServeFile(res, req, "signupjson.html")
return
}
username := req.FormValue("username")
password := req.FormValue("password")
var user string
err := db.QueryRow("SELECT username FROM users WHERE username=?", username).Scan(amp;user)
switch {
case err == sql.ErrNoRows:
_, err = db.Exec("INSERT INTO users(username, password) VALUES(?, ?)", username, password)
if err != nil {
http.Error(res, "insert error, unable to create your account.", 500)
return
}
res.Write([]byte("User Registered successfully!" username))
// get json response message
messageJson := `{"message": "User Registered successfully"}`
jsonresult_send := json.Marshal(messageJson)
return jsonresult_send
return
default:
http.Redirect(res, req, "/", 301)
}
}
func homePage(res http.ResponseWriter, req *http.Request) {
http.ServeFile(res, req, "index.html")
}
func main() {
db, err = sql.Open("mysql", "root:@/golang44")
if err != nil {
panic(err.Error())
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err.Error())
}
http.HandleFunc("/signupjson", signupPage)
http.HandleFunc("/", homePage)
fmt.Println("Listening on 127.0.0.1:8088")
http.ListenAndServe(":8088", nil)
}
Комментарии:
1. Нужно ли мне что-то вроде приведенного ниже кодирования. // Установите заголовок типа содержимого, чтобы клиенты знали, как читать ответ w.Header().Set(«Content-Type», «application / json») w.WriteHeader (http. StatusOK) // Записать ответ json обратно в response w.Write(jsonresult_send)
2. В консоли моего браузера мне нужно видеть что-то вроде массива или объекта ответа json. чтобы я мог, наконец, использовать его с моим интерфейсным кодом [{«message»: «Пользователь успешно зарегистрирован»}] или {«message»: «Пользователь успешно зарегистрирован»}
Ответ №1:
Если я правильно понял, вам нужно это:
func GetPeople(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(people)
}
В вашем случае вы могли бы решить это двумя способами:
- С помощью структуры
type Info struct {
Message string `json:"message"`
}
func MyHandler(w http.ResponseWriter, r *http.Request) {
... Some processing here ...
info := Info{Message: "User Registered successfully"}
json.NewEncoder(w).Encode(info)
}
- С помощью карты
func MyHandler(w http.ResponseWriter, r *http.Request) {
... Some processing here ...
info := map[string]string{"message": "User Registered successfully"}
json.NewEncoder(w).Encode(info)
}
Если кто-нибудь может проверить, нет ли какой-нибудь синтаксической ошибки, я ценю это.