Heim  >  Artikel  >  Backend-Entwicklung  >  Über eine HTTP-Anfrage an die vorhandene Liste anhängen

Über eine HTTP-Anfrage an die vorhandene Liste anhängen

WBOY
WBOYnach vorne
2024-02-14 15:57:07965Durchsuche

通过 http 请求追加到现有列表

PHP-Editor Xiaoxin Das Anhängen an eine vorhandene Liste über HTTP-Anfragen ist eine gängige Datenoperationsmethode. Durch das Senden von HTTP-Anfragen können wir neue Daten an die vorhandene Liste anhängen, um eine dynamische Aktualisierung und Hinzufügung von Daten zu erreichen. Diese Methode wird sehr häufig in der Webentwicklung verwendet und kann eine Echtzeitanzeige und -aktualisierung ermöglichen, nachdem Benutzer Daten übermittelt haben. Das Anhängen an eine bestehende Liste über HTTP-Anfragen ist einfach und schnell und verbessert die Interaktivität und Benutzererfahrung von Webseiten. Ob auf der Front-End-Seite oder in der Back-End-Logik, Daten können auf diese Weise angehängt werden, um umfangreichere und praktischere Funktionen zu erreichen.

Frageninhalt

Ich verwende Echo, um eine einfache Rest-API zu erstellen. Ich habe eine Variable, die die folgende Karte ist, basierend auf dieser Struktur, die ich erstellt habe:

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{}
    )

Wie sende ich nach dem Erstellen einer neuen Checkliste und dem Anhängen an die Checklistenvariable eine Anfrage zum Anhängen einer neuen Zeile im Feld „Zeilen“ der neuen Checkliste?

Die Lösung, die mir eingefallen ist, ist diese:

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)
    }

Wenn ich diesen Handler jedoch teste, liefert er die folgenden Ergebnisse:

// 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":[]}}

Die Funktion funktioniert also nicht wirklich, da das Pingen des Beitrags an die entsprechende Route weder die erwartete Antwort zurückgibt noch die Zeile tatsächlich zum Feld hinzufügt.

Lösung

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)
}

Probieren Sie es jetzt aus:

$ curl -X POST -H 'Content-Type: application/json' -d '{"lines": ["test123"]}' localhost:1234/checklist/1

(Hinweis "test123" in Klammern eingeschlossen)

Das obige ist der detaillierte Inhalt vonÜber eine HTTP-Anfrage an die vorhandene Liste anhängen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen