일일 운세 스트리밍
curl --request POST \
--url https://sajuapi.dev/v1/fortunes/daily-stream \
--header 'X-API-Key: <api-key>'import requests
url = "https://sajuapi.dev/v1/fortunes/daily-stream"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://sajuapi.dev/v1/fortunes/daily-stream', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sajuapi.dev/v1/fortunes/daily-stream",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sajuapi.dev/v1/fortunes/daily-stream"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sajuapi.dev/v1/fortunes/daily-stream")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sajuapi.dev/v1/fortunes/daily-stream")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body운세 (AI 생성)
일일 운세 스트리밍
Server-Sent Events를 통한 실시간 운세 스트리밍
POST
/
v1
/
fortunes
/
daily-stream
일일 운세 스트리밍
curl --request POST \
--url https://sajuapi.dev/v1/fortunes/daily-stream \
--header 'X-API-Key: <api-key>'import requests
url = "https://sajuapi.dev/v1/fortunes/daily-stream"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://sajuapi.dev/v1/fortunes/daily-stream', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sajuapi.dev/v1/fortunes/daily-stream",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sajuapi.dev/v1/fortunes/daily-stream"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sajuapi.dev/v1/fortunes/daily-stream")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sajuapi.dev/v1/fortunes/daily-stream")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body운세 생성 과정을 실시간으로 스트리밍하여 사용자 경험을 개선합니다.
요청
일반/v1/fortunes/daily 엔드포인트와 동일한 파라미터를 사용합니다.
응답 (Server-Sent Events)
event: start
data: {"type": "start", "requestId": "req_abc123", "model": "haiku"}
event: partial
data: {"type": "partial", "data": {"todayFortune": {"actionItems": [...]}}}
event: partial
data: {"type": "partial", "data": {"investmentFortune": {...}}}
event: complete
data: {"type": "complete", "data": {...}, "meta": {...}}
data: [DONE]
클라이언트 구현 예시
function useDailyFortuneStream(birthDate: string) {
const [fortune, setFortune] = useState(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
const eventSource = new EventSource(
`/v1/fortunes/daily-stream?birthDate=${birthDate}`,
{ headers: { 'X-API-Key': API_KEY } }
);
eventSource.addEventListener('partial', (e) => {
const partial = JSON.parse(e.data);
setFortune(prev => ({ ...prev, ...partial.data }));
});
eventSource.addEventListener('complete', (e) => {
const complete = JSON.parse(e.data);
setFortune(complete.data);
setIsLoading(false);
eventSource.close();
});
return () => eventSource.close();
}, [birthDate]);
return { fortune, isLoading };
}
캐시된 응답
캐시 히트 시 단일complete 이벤트로 즉시 응답합니다:
event: complete
data: {"type": "complete", "data": {...}, "meta": {"cached": true, "costPerCall": 0}}
data: [DONE]
⌘I