воскресенье, 3 февраля 2019 г.

Веб-приложение на Go: использование net/http для обслуживания вики-страниц

Чтобы использовать пакет net/http, его необходимо импортировать:

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

Давайте создадим обработчик viewHandler, который позволит пользователям просмотреть страницу вики. Он будет обрабатывать URL с префиксом "/view/".

func viewHandler(w http.ResponseWriter, r *http.Request) {
    title := r.URL.Path[len("/view/"):]
    p, _ := loadPage(title)
    fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>", 
                p.Title, p.Body)
}

Опять же, обратите внимание на использование _ для игнорирования error, при возвращении значения из loadPage. Это сделано здесь для простоты и вообще считается плохой практикой. Мы займемся этим позже.

Во-первых, эта функция извлекает заголовок страницы из r.URL.Path, компонента пути URL запроса. Path повторно разрезается с помощью [len("/view/"):] для удаления ведущего компонента "/view/" пути запроса. Это связано с тем, что путь всегда начинается с "/view/", который не является частью заголовка страницы.

Затем функция загружает данные страницы, форматирует страницу со строкой простого HTML и записывает его в w, http.ResponseWriter.

Чтобы использовать этот обработчик, мы переписываем нашу функцию main, чтобы инициализировать http, используя viewHandler для обработки любых запросов по пути /view/.

func main() {
    http.HandleFunc("/view/", viewHandler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

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

package main

import (
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
)

type Page struct {
  Title string
  Body  []byte
}

func (p *Page) save() error {
  filename := p.Title + ".txt"
  return ioutil.WriteFile(filename, p.Body, 0600)
}

func loadPage(title string) (*Page, error) {
  filename := title + ".txt"
  body, err := ioutil.ReadFile(filename)
  if err != nil {
    return nil, err
  }
  return &Page{Title: title, Body: body}, nil
}

func viewHandler(w http.ResponseWriter, r *http.Request) {
  title := r.URL.Path[len("/view/"):]
  p, _ := loadPage(title)
  fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>", 
              p.Title, p.Body)
}

func main() {
  http.HandleFunc("/view/", viewHandler)
  log.Fatal(http.ListenAndServe(":8080", nil))
}

Давайте создадим некоторые данные страницы (как test.txt), скомпилируем наш код и попробуем открыть страницу вики.

Откройте файл test.txt в своем редакторе и сохраните строку "Hello world" (без кавычек) в нем.

$ go build wiki.go
$ ./wiki

(Если вы используете Windows, вы должны ввести wiki без ./ для запуска программы.)

При работающем веб-сервере при обращении к http://localhost:8080/view/test должна отобразиться страница с названием «test», содержащая слова «Hello world».


Читайте также:


Комментариев нет:

Отправить комментарий