Siirry dokumentaation sisältöön
HintadataDocs

Vertailu ja hintahistoria

Tarvitset sandbox-API-avaimen, catalog:read- ja compare:read-oikeudet sekä curl- ja jq-ohjelmat. Hae vähintään kaksi eri tuotetta. Tuotantopyynnöt tarvitsevat tuoreen lähdeaineiston ja voivat kuluttaa käyttökiintiötä.

Tässä oppaassa
  1. 1Esivaatimukset
  2. 2Suorita ja varmista
  3. 3Palaudu turvallisesti
Tässä oppaassa
  1. 1Esivaatimukset
  2. 2Suorita ja varmista
  3. 3Palaudu turvallisesti

Esivaatimukset ja turvallisuus

Tarvitset sandbox-API-avaimen, catalog:read- ja compare:read-oikeudet sekä curl- ja jq-ohjelmat. Hae vähintään kaksi eri tuotetta. Tuotantopyynnöt tarvitsevat tuoreen lähdeaineiston ja voivat kuluttaa käyttökiintiötä.

Suorita eristetty harjoitus

Vertaa kahta tuotetta ja lue historia
  1. 1
    Hae tuotetunnisteet
  2. 2
    Vertaa toimitettuja hintoja
  3. 3
    Lue havaittu hintahistoria

Suorita omalta palvelimeltasi

bashillustrative
Esimerkin luotettavuus: illustrativeNäyttää muodon tai idean; älä käytä sellaisenaan tuotannossa.
set -euo pipefail
# Requires bash, curl and jq. Use an isolated sandbox API key.
DOCS_BASE_URL="${DOCS_BASE_URL:-https://hintadata.fi}"
: "${HINTADATA_API_KEY:?Set a sandbox API key privately}"
DOCS_VARIABLES=$(jq -cn  '{}')
DOCS_RESPONSE_FILE=$(mktemp)
trap 'rm -f -- "$DOCS_RESPONSE_FILE"' EXIT
# search: expected HTTP 200
DOCS_PATH="$(jq -cnr --argjson vars "$DOCS_VARIABLES" '"/v1/search?q=sony&limit=2"')"
DOCS_STATUS=$(curl --silent --show-error --max-time 20 --output "$DOCS_RESPONSE_FILE" --write-out '%{http_code}' -X 'GET' "$DOCS_BASE_URL$DOCS_PATH" -H "Authorization: Bearer $HINTADATA_API_KEY")
[[ "$DOCS_STATUS" == '200' ]] || { printf '%s\n' 'Unexpected HTTP status at search' >&2; exit 1; }
DOCS_RESPONSE=$(jq -c . "$DOCS_RESPONSE_FILE")
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("query") else false end))) and ($response["query"] == ("sony"))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("items") else false end) and ($response["items"] | if type == "object" or type == "array" then has(0) else false end) and ($response["items"][0] | if type == "object" or type == "array" then has("canonical_product_id") else false end)) == true)' >/dev/null
DOCS_VARIABLES=$(jq -cn --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" '$vars + {"productId":$response["items"][0]["canonical_product_id"],"secondId":$response["items"][1]["canonical_product_id"]}')
printf '%s\n' 'search: verified'
# compare: expected HTTP 200
jq -e 'has("productId")' <<< "$DOCS_VARIABLES" >/dev/null
jq -e 'has("secondId")' <<< "$DOCS_VARIABLES" >/dev/null
DOCS_PATH="$(jq -cnr --argjson vars "$DOCS_VARIABLES" '"/v1/compare?ids=" + ($vars["productId"] | tostring | @uri) + "," + ($vars["secondId"] | tostring | @uri) + ""')"
DOCS_STATUS=$(curl --silent --show-error --max-time 20 --output "$DOCS_RESPONSE_FILE" --write-out '%{http_code}' -X 'GET' "$DOCS_BASE_URL$DOCS_PATH" -H "Authorization: Bearer $HINTADATA_API_KEY")
[[ "$DOCS_STATUS" == '200' ]] || { printf '%s\n' 'Unexpected HTTP status at compare' >&2; exit 1; }
DOCS_RESPONSE=$(jq -c . "$DOCS_RESPONSE_FILE")
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("products") else false end) and ($response["products"] | if type == "object" or type == "array" then has(0) else false end) and ($response["products"][0] | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["products"][0]["canonical_product_id"] == ($vars["productId"]))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("products") else false end) and ($response["products"] | if type == "object" or type == "array" then has(1) else false end) and ($response["products"][1] | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["products"][1]["canonical_product_id"] == ($vars["secondId"]))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("products") else false end) and ($response["products"] | if type == "object" or type == "array" then has(0) else false end) and ($response["products"][0] | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["products"][0]["canonical_product_id"] == ($vars["productId"]))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("products") else false end) and ($response["products"] | if type == "object" or type == "array" then has(1) else false end) and ($response["products"][1] | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["products"][1]["canonical_product_id"] == ($vars["secondId"]))' >/dev/null
printf '%s\n' 'compare: verified'
# history: expected HTTP 200
jq -e 'has("productId")' <<< "$DOCS_VARIABLES" >/dev/null
DOCS_PATH="$(jq -cnr --argjson vars "$DOCS_VARIABLES" '"/v1/products/" + ($vars["productId"] | tostring | @uri) + "/history?range=30d"')"
DOCS_STATUS=$(curl --silent --show-error --max-time 20 --output "$DOCS_RESPONSE_FILE" --write-out '%{http_code}' -X 'GET' "$DOCS_BASE_URL$DOCS_PATH" -H "Authorization: Bearer $HINTADATA_API_KEY")
[[ "$DOCS_STATUS" == '200' ]] || { printf '%s\n' 'Unexpected HTTP status at history' >&2; exit 1; }
DOCS_RESPONSE=$(jq -c . "$DOCS_RESPONSE_FILE")
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["canonical_product_id"] == ($vars["productId"]))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("range") else false end))) and ($response["range"] == ("30d"))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("summary") else false end) and ($response["summary"] | if type == "object" or type == "array" then has("observation_count") else false end)) == true)' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("canonical_product_id") else false end))) and ($response["canonical_product_id"] == ($vars["productId"]))' >/dev/null
jq -en --argjson vars "$DOCS_VARIABLES" --argjson response "$DOCS_RESPONSE" --argjson status "$DOCS_STATUS" '((($response | if type == "object" or type == "array" then has("range") else false end))) and ($response["range"] == ("30d"))' >/dev/null
printf '%s\n' 'history: verified'

Varmista tulos

Vertailu palauttaa HTTP 200, products-listan ja kunkin best_offer.delivered_price-arvon. Historia palauttaa saman canonical_product_id:n, range-arvon, series-listan ja summary.observation_count-arvon. Nolla havaintoa tarkoittaa puuttuvaa näyttöä aikaväliltä, ei nollahintaa eikä hintaennustetta.

Palautuminen ja siivous

400: valitse 2–4 eri tunnistetta; vertailu ei hyväksy goal- tai range-parametria. Vain historia hyväksyy nämä range-arvot: 7d, 30d, 90d, 1y. 404: hae uudelleen, älä arvaa tunnistetta. 503: tarkista lähteen tuoreus. Null-arvoinen best_offer tarkoittaa, ettei saatavilla olevaa tarjousta tunneta.

Noudata 429- ja tilapäisissä 5xx-virheissä Retry-After-ohjetta ja rajaa uudelleenyritykset. Älä vie API-avaimia tai vastausrunkoja lokeihin tai tukipyyntöihin.

Oliko tästä sivusta apua?