2016-05-22 2 views
0

Je mettre en œuvre une url RESTful, ainsi je pourrais filtrer ma requête avec par exemple /api/v1.0/events?filter[title]="foo"&filter[content]="bar"Obtenir params comme une liste de tuple clé/valeur

est-il un moyen existant pour obtenir toutes les filter comme [("title", "foo"), ("content", "bar")]?

+0

Que voudriez-vous faire avec un tel type? Apparemment, je ne vois aucune raison de mettre une liste dans 'Maybe 'parce que' Just v' peut être encodé comme une liste singleton ('[v]') et 'Nothing' peut être encodé comme une liste vide (' [] '). Pourriez-vous clarifier vos objectifs? –

+0

J'ai mis à jour la question pour supprimer le Peut-être. Maintenant, c'est juste une liste de tuples. Toujours pas sûr comment l'obtenir :) – amitaibu

Répondre

1

D'abord, je vais créer un parseur avec attoparsec prendre une chaîne comme "filter[title]" et retour "title" de cette:

import Data.Attoparsec.Text 

filterParser :: Parser Text 
filterParser = do 
    _ <- string "filter[" 
    filterKey <- takeTill (== ']') 
    _ <- string "]" 
    return filterKey 

Obtenez les paramètres de chaîne de requête, une liste de (Text, Text), et les analyser en (filterKey, filterValue) paires :

getHomeR :: Handler Html 
getHomeR = do 

    params <- reqGetParams <$> getRequest -- (1) 

    let filters = catMaybes $ map (\(queryParam, filterValue) -> case maybeResult $ parse filterParser queryParam of  -- (2) (4) 
        Nothing -> Nothing   -- (3) 
        Just filterKey -> Just (filterKey, filterValue)  -- (3) 
       ) params 
    liftIO $ print $ "Params are " ++ show filters 
  1. obtenir les paramètres de chaîne de requête à l'aide reqGetParamsDepuis attoparsec, un Parser (filterParser) est ajouté à la partie clé de la chaîne de requête. Nous faisons immédiatement cela dans un Maybe en utilisant maybeResult de attoparsec. Si l'analyse réussit, nous obtenons un Just "title", ou en cas d'échec (le paramètre de requête ne ressemble pas à "filter=[foo]") nous obtenons Nothing.

  2. Si le paramètre était un filtre, renvoyer Just (filterKey, filterValue), sinon Nothing.

  3. Utilisez catMaybes pour supprimer tous les Nothing s de la liste, en ne donnant que les paires [(filterKey, filterValue)].

Avertissements:

  1. Ce code ne gère pas échapper. Je doute que vous ayez besoin de soutenir quelque chose comme "filter[foo\]bar]" cependant.
  2. Ce code ne supprime pas les guillemets autour des valeurs de paramètre de requête. Je pense que vous ne devriez pas les envoyer si possible, puisque vous ne les utilisez pas.
  3. Je ne suis pas très doué pour l'écriture de code d'analyse. Vous pourriez utiliser une regexp à la place si vous le souhaitez.
+0

wow, merci pour la réponse détaillée! N'imaginais pas le dire, mais c'est là que PHP $ _GET me manque - Il fait tout l'analyse «gratuitement»;) – amitaibu

+0

(btw, l'analyseur d'URL le plus proche que j'ai trouvé est https://github.com/Soostone/ uri-bytestring/blob/maître/src/URI/ByteString/Internal.hs # L142) – amitaibu