【问题标题】:Lookup parameter arrays from URL Queries in Yesod从 Yesod 中的 URL 查询中查找参数数组
【发布时间】:2020-10-07 23:42:46
【问题描述】:

我对 Haskell 和 Yesod 还很陌生,所以我一直在浏览许多教程和文档。我发现了另一个关于解析 url 查询的 StackOverflow:Lookup query parameters in Yesod 也就是说,该解决方案不适用于这些 url 查询中的参数数组。

例如: http://localhost:3000/models/product?field[]=test1&field[]=test2&field[]=test3&domain[]=["id","name",True]&limit=25

据我所知,/models/product 可以通过定义路由来处理,我什至可以获得domain[] 参数。但是,如果我在 field[] 上进行查找,我只能得到第一个值 test1,而我无法得到其余的值。另外,假设我不知道这个数组的大小,我将如何做到这一点?

谢谢!

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

    我通过一些 hack 代码解决了这个问题,但我确信那里可能有更好的解决方案。仅供参考:

    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]
    

    【讨论】:

      【解决方案2】:

      据我所知,在查询参数中没有处理数组的 HTTP 标准方法。一些工具,如 Ruby on Rails 或 PHP,都有自己的约定来在查询参数中表达数组。

      Yesod 在查询参数中没有自己的数组(或字典,或其他数据结构)格式,所以我认为没有任何官方 API 可以处理这个问题。

      如果可以,我建议在这种情况下使用 JSON 正文执行 POST 请求。如果它必须是 GET 请求,您也可以在查询参数中使用 JSON 执行 GET 并解析它。这使您可以避免编写自定义解析器代码,利用现有 aeson 实例的强大功能,将更易于跨 HTTP 客户端(如 Android/iOS/web)移植。诚然,这个建议是相当不标准的,但它在实践中对我很有用。

      【讨论】:

      • +1 建议使用 JSON 编码复杂数组。有很多很棒的教程可以用 Haskell 解析 JSON。
      猜你喜欢
      • 2014-10-04
      • 1970-01-01
      • 2017-08-31
      • 2018-09-12
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      相关资源
      最近更新 更多