Соответствие шаблону Lua для динамического URL-адреса

У меня есть требование, когда я должен изменить и сохранить динамический URL-адрес входящего запроса и сохранить его в нашем бэкэнде.

Ниже приведен пример URL

GET /v1/merchants 

С моим кодом Lua я меняю это на

GET_/v1/merchants

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

Например: GET /v1/content/merchants/{string}

URL-адрес может быть GET /v1/content/merchants/foo или GET /v1/content/merchants/bar.

Я хочу сохранить указанный выше формат в бэкэнде, например GET /v1/content/merchants/string, потому что я не могу хранить в бэкэнде GET_/v1/content/merchants/foo или GET_/v1/content/merchants/bar для каждого входящего запроса.

Ниже приведен код

local function get_method(request)
  local method, path, query_fragment = request:match("^(.+) ([^%?]+)(%??.*) .+$")
  if method and path then
    return method .. "_" .. path
  else
    return nil
  end
end

local function extract_usage(request)
  local usage_t =  {}
  local ts_method = get_method(request)
  if ts_method then
    usage_t[ts_method] = set_or_inc(usage_t, ts_method, 1)
    return build_querystring(usage_t)
  else
    return nil
  end
end

person vinbha    schedule 25.02.2016    source источник
comment
Что такое {id}? Любой символ, кроме / в конце строки или только цифры?   -  person Wiktor Stribiżew    schedule 25.02.2016
comment
{id} имеет тип данных = строка. Это может быть /v1/content/merchants/foo или /v1/content/merchants/bar. Я понимаю ваше замешательство и отредактирую пост.   -  person vinbha    schedule 25.02.2016
comment
Я до сих пор не понимаю, где беда. GET /v1/merchants не соответствует шаблону ^(.+) ([^%?]+)(%??.*) .+$. Пожалуйста, опубликуйте воспроизводимый фрагмент кода и ожидаемый результат.   -  person Wiktor Stribiżew    schedule 25.02.2016
comment
Пожалуйста, проверьте эту демонстрацию IDEONE. Если я вас правильно понял, get_method_updated позаботится о том, чтобы вы не получили подчеркнутые части запроса в качестве возвращаемого значения.   -  person Wiktor Stribiżew    schedule 25.02.2016


Ответы (1)


я предлагаю использовать

local function get_method_updated(request)
  local method, path, query_fragment = request:match("^(.+) ([^%?]+)(%??.*) .+$")
  if method and path then
    if path:match('^/[^/]+/[^/]+/[%w_]+') ~= nil then
        return method .. " " .. path
    else
        return method .. "_" .. path
    end 
  else
    return nil
  end
end

print(get_method_updated("GET /v1/merchants something"))
print(get_method_updated("GET /v1/content/merchants/foo or"))
print(get_method_updated("GET /v1/content/merchants/bar some"))

См. демонстрацию Lua.

Выход:

GET_/v1/merchants
GET /v1/content/merchants/foo
GET /v1/content/merchants/bar

get_method_updated гарантирует, что вы не получите подчеркнутые части запроса в качестве возвращаемого значения.

person Wiktor Stribiżew    schedule 04.05.2018