Делаю свой фреймворк, точнее web-сервер на go. Прошу веберов пояснить что встречается на практике и чего требует стандарт.
Вот кусок кода:
type CollectRequestDataHTTP struct { // В данной структуре размещаются извелечённые данные http запроса
VarsGetParams map[string]string
VarsPostParams map[string]string
Cookies map[string]string
Files map[string][]*multipart.FileHeader
URL string // Полная адресная строка
LocalURL string // Отночительная адресная строка
Domain string // Имя домена
}
func ParseRequestHTTP(r *http.Request) (*CollectRequestDataHTTP, error) { // Функция разбирает запрос
var maxLimitMemoryPostMB int64
maxLimitMemoryPostMB = 10 // Максимум мегабайт для обработки одного POST запроса
maxLimitMemoryPostBytes := maxLimitMemoryPostMB << 20 // Сдвигом получае число байт для указанного числа мегабайт
data := &CollectRequestDataHTTP{
VarsGetParams: make(map[string]string, 100),
VarsPostParams: make(map[string]string, 100),
Cookies: make(map[string]string, 100),
Files: make(map[string][]*multipart.FileHeader, 100),
URL: r.URL.String(),
LocalURL: r.URL.Path,
Domain: r.Host,
}
// Извлечение GET переменных
for key, values := range r.URL.Query() {
if len(values) > 0 {
data.VarsGetParams[key] = values[0]
}
}
// Извлечение POST переменных и файлов
if r.Method == http.MethodPost {
if err := r.ParseMultipartForm(maxLimitMemoryPostBytes); err != nil { // Это лимит памяти для разбора multipart/form-data запроса
return nil, err
}
for key, values := range r.PostForm {
if len(values) > 0 {
data.VarsPostParams[key] = values[0]
}
}
for key, theFile := range r.MultipartForm.File {
data.Files[key] = theFile
}
}
// Parse cookies
for _, cookie := range r.Cookies() {
data.Cookies[cookie.Name] = cookie.Value
}
return data, nil
}
Обращаю внимание на data.VarsPostParams[key] = values[0]
и прошу гопатыча пояснить смысл. Внезапно узнаю что бывает такое:
<form method="post" action="/submit">
<input type="checkbox" name="interests" value="sports"> Sports<br>
<input type="checkbox" name="interests" value="music"> Music<br>
<input type="checkbox" name="interests" value="movies"> Movies<br>
<input type="submit">
</form>
И такое:
<form method="post" action="/submit">
<select name="colors" multiple>
<option value="red">Red</option>
<option value="green">Green</option>
<option value="blue">Blue</option>
</select>
<input type="submit">
</form>
Это что же, мне придётся хранить данные в map[string][]string
? Как то совсем не то что хотел. Есть ли у кого идеи?
Первая мысль, засунуть через символ перевода строки значения. А если кто то сделает поля в которых возможны много строк текста с одним именем?