SDKs
Java
Thunderbit Open API 的 Java 地道寫法
用 java.net.http.HttpClient(內建,Java 11+)。想要更舒服的體驗 —— 連線池、重試 —— 搭配 OkHttp + Jackson。
設定
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
private static final String API = "https://openapi.thunderbit.com/openapi/v1";
private static final HttpClient CLIENT = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
private static HttpRequest.Builder request(String path) {
return HttpRequest.newBuilder()
.uri(URI.create(API + path))
.header("Authorization", "Bearer " + System.getenv("THUNDERBIT_API_KEY"))
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(60));
}Distill 一個頁面
String body = "{\"url\":\"https://thunderbit.com/playground\"}";
HttpResponse<String> res = CLIENT.send(
request("/distill").POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString()
);
if (res.statusCode() >= 400) throw new RuntimeException(res.body());Extract 結構化資料
String body = """
{
"url": "https://example.com/product/iphone-15-pro",
"schema": {
"type": "object",
"properties": {
"name": { "type": "string" },
"price": { "type": "number" }
},
"required": ["name", "price"]
}
}
""";
HttpResponse<String> res = CLIENT.send(
request("/extract").POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString()
);用 Jackson 或 Gson 把回應反序列化成你的 domain 型別。
Batch + Webhook
String body = """
{
"urls": ["https://example.com/page1", "https://example.com/page2"],
"webhook": {
"url": "https://your-server.com/webhook",
"secret": "%s"
}
}
""".formatted(System.getenv("WEBHOOK_SECRET"));
HttpResponse<String> res = CLIENT.send(
request("/batch/distill").POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString()
);在你的 handler 裡驗證 Webhook 簽名 —— 參見 Webhooks。
官方 Java SDK 開發中 —— 敬請期待。