LINUXTALKS.CO

Как правильно обрабатывать и обрабатывать ли множество параметров с одним ключём в http запросе?

 , , ,

L


0

1

Делаю свой фреймворк, точнее 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 ? Как то совсем не то что хотел. Есть ли у кого идеи?

Первая мысль, засунуть через символ перевода строки значения. А если кто то сделает поля в которых возможны много строк текста с одним именем?

★★★★★★

Пока что придумал вариант, сделать для структуры функцию (метод), которая будет принимать ключ, а возвращать список параметров, первым из которых будет строка, вторым тип (isGet bool), а третьим срез значений.

Может у кого есть идеи получше?

rezedent12    
★★★★★★
Windows / Firefox (RU)
Ответ на: комментарий от Anoxemian

Мне не парсер URL адресов нужен. Вернее он уже есть в используемой мною библиотеке. Я для того начал писать прокладку, что бы лишний раз не приходилось потом писать циклы перебора. Да бы код самого сайта был компактнее и проще.

rezedent12    
★★★★★★
Windows / Firefox (RU)