笑话大全多语言接入:Python / Java / Node.js / Go 完整示例
# 笑话大全多语言接入:Python / Java / Node.js / Go 完整示例
> 接口 341-5 · 免费 · POST/GET · JSON · 适用人群:中高级开发者 · 阅读时间:约 6 分钟
## 核心要点
- 四种语言(Python / Java / Node.js / Go)均给出"替换 AppKey 即可运行"的示例。
- 统一要点:超时 20s、判 `ret_code == 0` 再取 `text`、失败读 `remark`。
- 接口无业务参数,四种语言写法高度相似,仅 HTTP 客户端不同。
## Why
不同团队技术栈不同:数据分析用 Python,后端用 Java/Go,前端/网关用 Node。本篇把四种语言的"最小可运行调用"一次性给全,你照抄对应那段、替换 AppKey 就能用,不必再各自摸索超时与错误判断。
## What
| 项 | 说明 |
|----|------|
| 端点 | `https://route.showapi.com/341-5?appKey=YOUR_APPKEY` |
| 方式 | POST(或 GET) |
| 超时 | 20s(对齐 OpenAPI `x-read-timeout`) |
| 成功判定 | `showapi_res_body.ret_code == 0` |
| 展示字段 | `showapi_res_body.text` |
## How
### Python(requests)
```python
import requests
APP_KEY = "YOUR_APPKEY"
resp = requests.post(
"https://route.showapi.com/341-5",
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=20,
)
body = resp.json()["showapi_res_body"]
if body["ret_code"] == 0:
print(body["text"])
else:
print("失败:", body["remark"])
```
### Java(HttpClient,Java 11+)
```java
import java.net.http.*;
import java.net.URI;
public class JokeDemo {
public static void main(String[] args) throws Exception {
String appKey = "YOUR_APPKEY";
HttpClient client = HttpClient.newBuilder().connectTimeout(java.time.Duration.ofSeconds(20)).build();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://route.showapi.com/341-5?appKey=" + appKey))
.header("content-type", "application/x-www-form-urlencoded")
.timeout(java.time.Duration.ofSeconds(20))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
// 解析 JSON 后判 showapi_res_body.ret_code == 0 再取 text
}
}
```
### Node.js(fetch)
```javascript
const APP_KEY = "YOUR_APPKEY";
const resp = await fetch(`https://route.showapi.com/341-5?appKey=${APP_KEY}`, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
});
const data = await resp.json();
const body = data.showapi_res_body || {};
if (body.ret_code === 0) console.log(body.text);
else console.log("失败:", body.remark);
```
### Go(net/http)
```go
package main
import (
"fmt"
"io"
"net/http"
"time"
)
func main() {
appKey := "YOUR_APPKEY"
client := &http.Client{Timeout: 20 * time.Second}
req, _ := http.NewRequest("POST", "https://route.showapi.com/341-5?appKey="+appKey, nil)
req.Header.Set("content-type", "application/x-www-form-urlencoded")
resp, err := client.Do(req)
if err != nil {
fmt.Println("请求错误:", err)
return
}
defer resp.Body.Close()
b, _ := io.ReadAll(resp.Body)
fmt.Println(string(b)) // 解析 JSON 后判 showapi_res_body.ret_code == 0 再取 text
}
```
## 返回示例与解析
四种语言拿到的 JSON 结构一致,详见[返回字段全解](https://www.showapi.com/guides/joke-api-response-fields-341)。建议解析后统一以 `ret_code == 0` 为成功条件。
## 进阶 / 边界
- **超时务必设置**:未设超时可能阻塞;本接口建议 20s。
- **错误判断用业务级 `ret_code`**:不要只看 HTTP 200,要看 `showapi_res_body.ret_code`。
- **生产加缓存**:高频调用请缓存(见[缓存与档位](https://www.showapi.com/guides/joke-api-cache-tier-341))。
- **AppKey 走配置**:各语言都建议从环境变量读取 AppKey,勿硬编码。
## FAQ
**Q1:四种语言返回结果不一样吗?**
一样。都是同一接口的 JSON,差异只在 HTTP 客户端与 JSON 解析写法。
**Q2:GET 和 POST 用哪种?**
都支持,示例用 POST;GET 把 appKey 放 query 即可。
**Q3:Java/Go 示例里怎么解析 JSON?**
示例打印原始 body;生产请用 Jackson(Java)/ encoding/json(Go)解析 `showapi_res_body`。
**Q4:超时设多少合适?**
对齐官方 OpenAPI 的 20s 读/连接超时即可。
**Q5:能并发调用拉多条不同笑话吗?**
可以,但注意免费接口的使用档位限制,高频并发可能触发限流。
## 相关能力 / 下一步阅读
- [笑话大全返回字段全解:showapi_res_body 与 id/title/text 一文读懂](https://www.showapi.com/guides/joke-api-response-fields-341)
- [免费接口也要讲边界:笑话大全缓存策略与档位限制应对](https://www.showapi.com/guides/joke-api-cache-tier-341)
- [笑话大全调用失败排查:showapi_res_code 与 ret_code 非 0 怎么办](https://www.showapi.com/guides/joke-api-error-341)
- **本系列共 10 篇**:查看[笑话大全 API 指南总目录](https://www.showapi.com/guides/joke-api-guides-341)