1

私はリングをより深く掘り下げようとしており、リクエストマップで何が起こっているかを確認するために次のコードを用意しています:

(require '[ring.adapter.jetty :as serv])
(require '[ring.middleware.params :as wp])

(defn base-handler [params]
  {:コード 200
   :タイプ "txt/html"
   :body (str params)})

(defn wp-handler [params]
  ((wp/wrap-params base-handler) params))

(serv/run-jetty #'wp-handler {:ポート 8099})

getリクエストマップでクエリデータを見たいときはそこにあります。ブラウザに入力するhttp://localhost:8099/api/tasks/remove?hello=3と、応答は次のようになります。

{:ssl-client-cert nil,
 :remote-addr "127.0.0.1",
 :スキーム:http、
 :request-method :get,
 :uri "/api/tasks/remove"
 :クエリ文字列 "hello=3"
  .... もっと ....}

「hello=3」がクエリ文字列に含まれていることがわかります。


しかしpost、応答には :content-type"application/x-www-form-urlencoded"があり、応答全体は次の例のようになり、フォーム パラメータは表示されません。

{:ssl-client-cert nil, :remote-addr "127.0.0.1", :scheme :http, :request-method :post, :query-string nil, :content-type "application/x-www-form- urlencoded", :uri "/api/tasks/remove", :server-name "localhost", :headers {"user-agent" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML など) Gecko) Chrome/20.0.1132.47 Safari/536.11", "origin" "http://localhost:8099", "accept-charset" "ISO-8859-1,utf-8;q=0.7,*;q=0.3 ", "accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "host" "localhost:8099", "referer" "http:// localhost:8099/form.html", "content-type" "application/x-www-form-urlencoded", "cache-control" "max-age=0", "accept-encoding" "gzip,deflate,sdch", "content-length" "23", "accept-language" "en-US,en;q=0.8", "接続"" keep-alive"}, :content-length 23, :server-port 8099, :character-encoding nil, :body #}

私の質問は2つの部分に分かれています:

  1. フォームが送信されたとき、リングまたは桟橋は正確に何をしていますか?
  2. フォーム データを処理するために独自のコードを作成しようとしている場合handler、フォーム クエリ パラメータにアクセスする方法の簡略化されたコード スケルトンは何ですか?

「魔法」を次の関数に分離しましたparams.clj

(defn- assoc-form-params
  "Parse and assoc parameters from the request body with the request."
  [request encoding]
  (merge-with merge request
    (if-let [body (and (urlencoded-form? request) (:body request))]
      (let [params (parse-params (slurp body :encoding encoding) encoding)]
        {:form-params params, :params params})
      {:form-params {}, :params {}})))

特にこの行:

(parse-params (slurp body :encoding encoding) encoding)

しかし、それが何をしているのかわかりません。

4

1 に答える 1

0

urlencode-formのソースコードで判断しますか?リクエストはapplication/x-www-form-urlencodedであるため、parse-paramsが呼び出されることはありません。こちらのリクエストタイプの説明をご覧ください。

どのようにPOSTリクエストを送信しますか?私が理解している限り、パラメータはmultipart / form-dataモードで送信されますが、リクエスト自体はapplication/x-www-form-urlencodedとしてマークされています。

于 2012-09-08T20:10:08.427 に答える