2016-12-13 7 views
7

cljs-Аякса клиентская библиотека ClojureScript преобразует {:b [1 2]} в b[0]=1&b[1]=2Clojure кольцо промежуточного слоя для обработки URL-адрес массива

Например:

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

результатов в запросе на:

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

Как можно Я настраиваю свое промежуточное программное обеспечение для обработки этого формата на стороне сервера? Я хотел бы, чтобы преобразовать его обратно в исходную структуру:

{:b [1 2]} 

Я использую ниже промежуточного уровня, но он не работает должным образом:

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

ответ

0

Я хотел бы предложить промежуточное программное обеспечение работает нормально, но возможно, существует несогласованность между тем, что она делает и ваши ожидания. Я предполагаю, что то, что у вас есть, это всего лишь список промежуточного программного обеспечения, а не то, как вы его вызываете/используете. Если нет, то ваш путь от трека.

Строго говоря, то, что вы пытаетесь передать, не является вложенным параметром. У вас действительно есть параметры с именами типа «b [0]» и «b [1]», каждый из которых имеет значение. Это потому, что вы используете get, а не post, а cljs-ajax необходимо перевести вашу структуру данных clojure в обычный формат параметров запроса. Если нет веских оснований для этого, вы найдете жизнь намного легче, если вы используете почтовый метод, а не получаете и вставляете данные в тело как json/edn/transit. Он также имеет дополнительное преимущество в том, что ваши данные не будут отправляться «общедоступными» как часть URL-адреса и фиксироваться журналами повсеместно.

Полезный серверный пакет для использования с командами cljs-ajax и post - ring.middleware.format. Это упростит синтаксический анализ данных в теле вашего запроса и поддерживает несколько разных методов кодирования данных.

1

В промежуточном программном обеспечении нет проблем. Вопрос находится в cljs-ajax's ajax.core/params-to-str api. Он создает повторяющийся URL-адрес для разных форматов данных.

(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" 

Для массива формат должен быть b[]=1&b[]=3.