php editor Xiaoxin appending to an existing list through http requests is a common data operation method. By sending http requests, we can append new data to the existing list to achieve dynamic updating and addition of data. This method is very commonly used in web development, and can realize real-time display and update after users submit data. Appending to an existing list via http requests is simple and fast, improving the interactivity and user experience of web pages. Whether in the front-end page or the back-end logic, data can be appended in this way to achieve richer and more practical functions.
I am using echo to make a simple rest api. I have a variable that is the following map, based on this structure I made:
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{} )
After creating a new checklist and appending it to the checklists variable, how do I send a request to append a new row in the "rows" field of the new checklist?
The solution I thought of is this:
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) }
However, when I test this handler, it gives the following results:
// 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":[]}}
So the function doesn't actually work because pinging the post to the appropriate route neither returns the expected response nor actually adds the row to the field.
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) }
Try now:
$ curl -X POST -H 'Content-Type: application/json' -d '{"lines": ["test123"]}' localhost:1234/checklist/1
(note "test123"
enclosed in brackets)
The above is the detailed content of Append to existing list via http request. For more information, please follow other related articles on the PHP Chinese website!