2016-12-13 5 views
7

ClojureScript cljs AJAX biblioteki klienta przekształca {:b [1 2]} do b[0]=1&b[1]=2Clojure pierścień middleware do obsługi url tablicę

Na przykład:

(http/get "http://example.com" {:b [1 2]}) 

skutkuje prośbą o:

"http://example.com?b[0]=1&b[1]=2" 

jak można Instaluję oprogramowanie pośredniczące do pierścienia, aby obsłużyć ten format po stronie serwera? Chciałbym, aby przekształcić go z powrotem do pierwotnej strukturze:

{:b [1 2]} 

używam poniższego middleware, ale to nie działa prawidłowo:

(ring.middleware.keyword-params/wrap-keyword-params) 
(ring.middleware.params/wrap-params :encoding encoding) 
(ring.middleware.nested-params/wrap-nested-params) 

Odpowiedz

0

Proponuję middleware pracuje bez zarzutu, ale być może istnieje rozbieżność pomiędzy tym, co robi, a twoimi oczekiwaniami. Zakładam, że to, co masz powyżej, jest po prostu listą oprogramowania pośredniczącego, a nie w jaki sposób je wywołujesz/używasz. Jeśli nie, zejdź ze ścieżki.

Ściśle mówiąc, to, co próbujesz przekazać, nie jest parametrem zagnieżdżonym. To, co naprawdę masz, to parametry o nazwach "b [0]" i "b [1]", z których każda ma wartość. Dzieje się tak, ponieważ używasz get, a nie post i cljs-ajax, aby przetłumaczyć twoją strukturę danych clojure na normalny format parametrów zapytania. Jeśli nie ma silnego powodu, aby to zrobić, znajdziesz życie o wiele łatwiej, jeśli użyjesz metody post, a nie uzyskasz i osadzisz dane w ciele jako json/edn/transit cokolwiek. Dodatkową korzyścią jest to, że Twoje dane nie będą wysyłane jako "publiczne" jako część adresu URL i przechwycone przez logi w całym miejscu.

Przydatnym pakietem po stronie serwera do użycia z komendami cljs-ajax i post jest ring.middleware.format. Ułatwi to parsowanie danych w treści żądania i obsługuje wiele różnych metod kodowania danych.

1

Po stronie oprogramowania pośredniego nie ma problemu. Problem dotyczy interfejsu API cljs-ajax's ajax.core/params-to-str. Generuje zduplikowany adres URL dla różnych formatów danych.

(ajax.core/params-to-str {:b [1 3]}) 
;; => "b[0]=1&b[1]=3" 

(ajax.core/params-to-str {:b {0 1 1 3}}) 
;; => "b[0]=1&b[1]=3" 

Dla tablicy format powinien wynosić b[]=1&b[]=3.

Powiązane problemy