2016-05-22 8 views
0

Ich bin eine RESTful url Implementierung, also konnte ich meine Abfrage-Filter mit zum Beispiel /api/v1.0/events?filter[title]="foo"&filter[content]="bar"Erste params als eine Liste von Schlüssel/Wert-Tupel

Gibt es eine vorhandene Art und Weise alle filter als [("title", "foo"), ("content", "bar")] zu bekommen?

+0

Was möchten Sie mit einem solchen Typ machen? Offensichtlich sehe ich keinen Grund dafür, eine Liste in ein 'Maybe' zu ​​schreiben, da' Just v' als Singleton-Liste ('[v]') kodiert werden kann und 'Nothing' als leere Liste (' [] 'kodiert werden kann). Könnten Sie Ihre Ziele klären? –

+0

Ich habe die Frage aktualisiert, um das Maybe zu entfernen. Jetzt ist es nur eine Liste von Tupeln. Immer noch nicht sicher, wie man es bekommt :) – amitaibu

Antwort

1

Zuerst werde ich einen Parser mit attoparsec erstellen eine Zeichenfolge wie "filter[title]" zu nehmen, und das Rück "title" davon:

import Data.Attoparsec.Text 

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

die Query-String-Parameter holen, um eine Liste von (Text, Text) und analysieren sie in (filterKey, filterValue) Paare :

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. der Query-String-Parameter reqGetParams mit Get

  2. parse von attoparsec wendet eine Parser (filterParser) auf den Schlüsselteil der Abfragezeichenfolge an. Wir machen das sofort zu einem Maybe mit maybeResult von attoparsec. Wenn das Parsen erfolgreich ist, erhalten wir eine Just "title", oder wenn es fehlschlägt (der Abfrageparameter sah nicht wie "filter=[foo]" aus) erhalten wir Nothing.

  3. Wenn der Parameter ein Filter war, geben Sie Just (filterKey, filterValue) zurück, andernfalls Nothing.

  4. Verwenden catMaybes all Nothing s aus der Liste zu entfernen, uns nur die [(filterKey, filterValue)] Paare geben.

Caveats:

  1. Dieser Code behandelt nicht entkommen. Ich bezweifle jedoch, dass Sie etwas wie unterstützen müssen.
  2. Dieser Code entfernt nicht die Anführungszeichen um die Abfrageparamwerte. Ich denke, du solltest diese nicht einfach schicken, wenn du sie nicht verwendest.
  3. Ich bin nicht sehr gut in Parsing-Code zu schreiben. Sie könnten stattdessen eine Regexp verwenden, wenn Sie möchten.
+0

wow, danke für die ausführliche Antwort! Ich konnte mir nicht vorstellen, das zu sagen, aber das ist, wo ich PHP $ _GET vermisse - Es macht das ganze Parsen "kostenlos";) – amitaibu

+0

(übrigens, der nächste URL-Parser, den ich gefunden habe, ist https://github.com/Soostone/ uri-bytestring/blob/master/src/URI/ByteString/Intern.hs # L142) – amitaibu