Editor PHP Xiaoxin Menambahkan pada senarai sedia ada melalui permintaan http ialah kaedah operasi data biasa. Dengan menghantar permintaan http, kami boleh menambahkan data baharu pada senarai sedia ada untuk mencapai pengemaskinian dinamik dan penambahan data. Kaedah ini sangat biasa digunakan dalam pembangunan web, dan boleh merealisasikan paparan dan kemas kini masa nyata selepas pengguna menyerahkan data. Melampirkan pada senarai sedia ada melalui permintaan http adalah mudah dan pantas, meningkatkan interaktiviti dan pengalaman pengguna halaman web. Sama ada dalam halaman hadapan atau logik belakang, data boleh ditambah dengan cara ini untuk mencapai fungsi yang lebih kaya dan praktikal.
Saya menggunakan gema untuk membuat api rehat yang mudah. Saya mempunyai pembolehubah iaitu peta berikut, berdasarkan struktur yang saya buat ini:
type checklist struct { id int `json:"id"` title string `json:"title"` lines []string `json:"lines"` authorname string `json:"authorname"` authorid int `json:"authorid"` tags []tag `json:"tags"` } var ( checklists = map[int]*checklist{} checklistseq = 1 checklistlock = sync.mutex{} )
Selepas mencipta senarai semak baharu dan melampirkannya pada pembolehubah senarai semak, bagaimanakah cara saya menghantar permintaan untuk menambahkan baris baharu dalam medan "baris" senarai semak baharu?
Penyelesaian yang saya fikirkan ialah ini:
func createchecklist(c echo.context) error { checklistlock.lock() defer checklistlock.unlock() newchecklist := &checklist{ id: checklistseq, lines: make([]string, 0), tags: make([]tag, 0), } if err := c.bind(newchecklist); err != nil { return err } checklists[newchecklist.id] = newchecklist checklistseq++ return c.json(http.statusok, newchecklist) } func addline(c echo.context) error { checklistlock.lock() defer checklistlock.unlock() id, _ := strconv.atoi(c.param("id")) checklist := *checklists[id] line := []string{""} if err := c.bind(line); err != nil { return err } checklist.lines = line return c.json(http.statuscreated, checklists) }
Namun, apabila saya menguji pengendali ini, ia memberikan keputusan berikut:
// 1: Creating a new checklist $ curl -X POST -H 'Content-Type: application/json' -d '{"title": "test"}' localhost:1234/checklist >> {"id":1,"title":"test","lines":[],"authorName":"","authorID":0,"tags":[]} // 2: Check to see the checklist has been created. $ curl -X GET localhost:1234/checklist >> {"1":{"id":1,"title":"test","lines":[],"authorName":"","authorID":0,"tags":[]}} // 3: Attempting to create a new line $ curl -X POST -H 'Content-Type: application/json' -d '{"lines": "test123"}' localhost:1234/checklist/1 >> curl: (52) Empty reply from server // 4: Confirming it hasn't been created. $ curl -X GET localhost:1234/checklist >> {"1":{"id":1,"title":"test","lines":[],"authorName":"","authorID":0,"tags":[]}}
Jadi fungsi itu sebenarnya tidak berfungsi kerana ping siaran ke laluan yang sesuai tidak mengembalikan respons yang dijangkakan mahupun menambahkan baris ke medan.
func addline(c echo.context) error { checklistlock.lock() defer checklistlock.unlock() id, err := strconv.atoi(c.param("id")) if err != nil { return err } // do not deref *checklist cl, ok := checklists[id] if !ok { return echo.errnotfound } // use same structure as the expected json var input struct { lines []string `json:"lines"` } // always pass a pointer to c.bind if err := c.bind(&input); err != nil { return err } // do not overwrite previously written lines, use append cl.lines = append(cl.lines, input.lines...) return c.json(http.statusok, cl) }
Cuba sekarang:
$ curl -X POST -H 'Content-Type: application/json' -d '{"lines": ["test123"]}' localhost:1234/checklist/1
(nota "test123"
disertakan dalam kurungan)
Atas ialah kandungan terperinci Tambahkan pada senarai sedia ada melalui permintaan http. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!