Массивы параметров поиска из URL-запросов в Yesod - PullRequest
3 голосов
/ 18 июня 2020

Я новичок в Haskell и Yesod, поэтому я просмотрел множество руководств и документации. Я нашел еще один StackOverflow о разборе запросов URL: Параметры запроса поиска в Yesod Тем не менее, решение не работает для массивов параметров в этих запросах URL.

Например: http://localhost:3000/models/product?field[]=test1&field[]=test2&field[]=test3&domain[]=["id","name",True]&limit=25

Насколько я могу судить, /models/product можно обработать, определив маршрут, и я могу даже получить параметр domain[]. Однако, если я выполняю поиск по field[], я могу получить только первое значение test1, а у меня нет возможности получить остальное. Кроме того, предполагая, что я ничего не знаю о размере этого массива, как бы я мог выполнить sh это?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 июня 2020

Насколько мне известно, стандартного HTTP-способа обработки массивов в параметрах запроса не существует. Некоторые инструменты, такие как Ruby on Rails или PHP, имеют свои собственные соглашения для выражения массивов в параметрах запроса.

Yesod не имеет собственного формата для массивов (или словарей, или других структур данных) в параметрах запроса, поэтому я не думаю, что существует какой-либо официальный API, чтобы справиться с этим.

Если вы можете, я бы рекомендовал сделать запрос POST с телом JSON для этого случая. Если это должен быть запрос GET, вы также можете выполнить GET с JSON в параметрах запроса и проанализировать его.

0 голосов
/ 18 июня 2020

Я решил это с помощью некоторого хакерского кода, но я уверен, что, вероятно, есть лучшее решение. Просто отправьте это для справки:

getProductR :: Handler Value
getProductR = do
    getParameters <- reqGetParams <$> getRequest
    let fields = [ b | (a,b) <- getParameters , a == "field[]"]
    let domains = cleanseInput getParameters "domain[]"
    let limit = Import.lookup (Import.pack "limit") getParameters

    return $ object [
                        (Import.pack "fields") .= fields,
                        (Import.pack "domains") .= domains,
                        (Import.pack "limit") .= limit
                    ]

cleanseInput params key = [ Data.List.filter (/= "") [Data.Text.filter (/= ',' ) x | x<-(Data.Text.splitOn "\"" (Data.Text.tail (Data.Text.init b)))] | (a,b) <- params , a == key]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...