Извлечение значения строки запроса - PullRequest
0 голосов
/ 22 мая 2019

Как извлечь значение имени пользователя из этой строки запроса (в кодировке HTTP): username=james&password=pwd в Tcl?

Я могу получить его через Java request.getParameter("username");, но как использовать Tcl?

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

Предполагая, что это среда CGI, где среда будет содержать

REQUEST_METHOD=GET
QUERY_STRING='username=james&password=pwd'

или

REQUEST_METHOD=POST
CONTENT_LENGTH=27
# and stdin contains "username=james&password=pwd"

затем используйте модуль ncgi tcllib

$ cat > cgi.tcl
#!/usr/bin/env tclsh
package require ncgi
::ncgi::parse
array set params [::ncgi::nvlist]
parray params

$ printf "username=james&password=pwd" | env REQUEST_METHOD=POST CONTENT_LENGTH=27 ./cgi.tcl
params(password) = pwd
params(username) = james

$ env REQUEST_METHOD=GET QUERY_STRING='username=james&password=pwd' ./cgi.tcl
params(password) = pwd
params(username) = james
0 голосов
/ 22 мая 2019

Альтернатива предложению Донала, разделяющего дух, но основанный на батареях: tcllib rest пакет :

(1) Чтобы обработать запрос (как часть действительного URL)

% package req rest
1.3.1
% set query [rest::parameters ?username=jo%3Dhn]; # http:// is default scheme, ? is minimum URL boilerplate
username jo%3Dhn

(2) Запустите URL-декодер (например, один от Донала или один из код Розетты ):

% proc urlDecode {str} {
   set specialMap {"[" "%5B" "]" "%5D"}
   set seqRE {%([0-9a-fA-F]{2})}
   set replacement {[format "%c" [scan "\1" "%2x"]]}
   set modStr [regsub -all $seqRE [string map $specialMap $str] $replacement]
   return [encoding convertfrom utf-8 [subst -nobackslash -novariable $modStr]]
}

, то:

% set info [lmap v $query {urlDecode $v}]
username jo=hn
% dict get $info username
jo=hn
0 голосов
/ 22 мая 2019

Первый этап - разделить строку запроса и сформировать из нее словарь (что не совсем правильно, но я предполагаю, что вам не важно, когда кто-то помещает в запрос несколько полей имени пользователя).строка!).Тем не менее, вам также нужно декодировать кодировку содержимого, и это довольно ужасно:

proc QueryStringToDict {qs} {
    set mapping {}
    foreach item [split $qs "&"] {
        if {[regexp {^([^=]+)=(.*)$} $item -> key value]} {
            dict set mapping [DecodeURL $key] [DecodeURL $value]
        }
    }
    return $mapping
}
proc DecodeURL {string} {
    # This *is* tricky! The URL encoding of fields is way nastier than you thought!
    set mapped [string map {+ { } \[ "\\\[" \] "\\\]" $ "\\$" \\ "\\\\"} $string]
    encoding convertfrom utf-8 \
            [subst [regsub -all {%([[:xdigit:]]{2})} $string {[format %c 0x\1]}]]
}

set qs "username=james&password=pwd"
set info [QueryStringToDict $qs]
puts "user name is [dict get $info username]"

В 8.7 (в настоящее время в альфа-режиме) будет гораздо проще выполнить внутреннее кодирование;например, subst звонить туда не нужно.Но у вас нет этой версии Tcl;никто не имеет (за исключением людей, которые настаивают на том, чтобы быть на острие и попадают в неприятности из-за этого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...