Clojure, Compojure-api: заголовки запросов доступа

Я пытаюсь реализовать аутентификацию конечной точки запроса. Для этого я хочу получить доступ к значению accessToken из заголовков запросов.

Конечная точка моего запроса GET

CURL Command

curl -X GET \
  'http://localhost:3000/hello?id=10' \
  -H 'accesskey: 23423sfsdfsdfsfg' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'postman-token: f69b34e6-4888-ec31-5fbc-b734e176571b' \
  -d '{
    "artwork": {id" : 1}
}'

Команда HTTP

GET /hello?id=10 HTTP/1.1
Host: localhost:3000
Content-Type: application/json
accessKey: 23423sfsdfsdfsfg
Cache-Control: no-cache
Postman-Token: b974719d-5e1d-4d68-e910-e9ca50562b2f

Мой код для реализации метода GET

(defapi app
  (GET ["/hello/:id", :id #"[0-9]+" ] [id]
    (log/info "Function begins from here")
    (def artworkData (logic/artwork-id (->> id (re-find #"\d+") Long/parseLong)))
    (def data (if (not-empty artworkData)
               {:data artworkData :status 200}
               {:data [] :status 201}))
   (ok data)))

Я хочу получить accessKey: 23423sfsdfsdfsfg из заголовка запроса.

Есть ли способ получить значение и использовать в моем методе GET?

Я использую POSTMAN для проверки всех конечных точек API.

3 ответа

Compojure имеет собственный синтаксис деструктурирования (т. Е. Отличается от собственно Clojure) для параметров. Вы можете связать всю карту запроса, используя ключевое слово :as

(defapi app
  (GET ["/hello/:id", :id #"[0-9]+" ] [id :as request]

Если вы хотите запрашивать только заголовки, должно работать следующее

(defapi app
  (GET ["/hello/:id", :id #"[0-9]+" ] [id :as {:headers headers}]

Обратите внимание, что это все еще позволяет вам связать параметр пути id,

Compojure Sweet API работает как [compojure.api.sweet :refer [defroutes GET PUT context]] давайте свяжем весь запрос или свяжем выбранные заголовки. Во фрагменте ниже [:as request] делает весь запрос доступным для меня.

  (GET
    "/download/:id"
    [:as request]
    :header-params [{x-http-request-id :- X-Http-Request-Id nil}]
    :path-params [id :- (describe String "The encoded id of the image")]
    :summary "Download the image bytes"
    :description "This endpoint responds 307 - Temporary Redirect to a cacheable presigned S3 URL for the actual bytes."
    (let [http-response (->> request
                             walk/keywordize-keys
                             util/extract-base-url
                             (transform/generate-resource-url (util/decode-key id))
                             status/temporary-redirect)
          expire-time (-> 3 hours from-now coerce/to-date ring-time/format-date)]
      (log/infof "x-http-request-id is %s" x-http-request-id)
      (response/header http-response "Expires" expire-time)))
  1. Начало вектора :header-params [{x-http-request-id :- X-Http-Request-Id nil}] делает значение заголовка "X-HTTP-REQUEST-ID" в запросе доступным для моей функции как x-http-request-id,
  2. Волнистая вещь {...} делает наличие заголовка x-http-request-id необязательным в запросе.
  3. :- X-Http-Request-Id nil материал дает ему схему, которая определяется где-то еще, как (s/defschema X-Http-Request-Id (rss/describe String "Request ID for tracing calls")),

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

Я разобрался с решением проблемы. Пожалуйста, проверьте решение здесь.

(ns clojure-dauble-business-api.core
  (:require [compojure.api.sweet :refer :all]
            [ring.util.http-response :refer :all]
            [clojure-dauble-business-api.logic :as logic]
            [clojure.tools.logging :as log]
            [clojure-dauble-business-api.domain.artwork]
            [cheshire.core :as json])
  (:import [clojure_dauble_business_api.domain.artwork Artwork]))

(defapi app
  (GET ["/hello/:id", :id #"[0-9]+"] [id :as request]
    (log/info "Function begins from here" request)
    (def jsonString (json/generate-string (get-in request [:headers])))
    (log/info "Create - Access Key  is " (get-in (json/parse-string jsonString true) [:accesskey]))
    (def artworkData (logic/artwork-id (->> id (re-find #"\d+") Long/parseLong)))
    (def data (if (not-empty artworkData)
               {:data artworkData :status 200}
               {:data [] :status 201})))

Я не думаю, что это умный способ.

Кто-нибудь может взглянуть на мое решение и сказать мне, есть ли другой способ получить ключ доступа?

Другие вопросы по тегам