API�鍙戜腑的刄RL缂栫爜锛綘涓嶇煡撶殑鍧戜笌瑙e喅鏂
胖袋鼠锟?/span>
2026-04-26
鍦ˋPI�鍙戜腑锛RL缂栫爜鏄涓湅浼肩畝鍗曞嵈鍏呮弧闄烽槺的勯鍩熴�傚緢澶紑鍙戣�杩欎釜鐪嬩技鍩虹的棶棰樹笂缈昏溅锛屽鑷PI鍑虹幇涔辩爜銆佽В鏋愰敊璇�佸畨鍏ㄦ紡娲炵瓑闂銆備綘鏄惁涔熼亣鍒拌繃杩欎簺闂锛腑鏂囧弬鏁板彉鎴贡鐮併�佺娈婂瓧绗﹀鑷磋В鏋け璐ャ�佸璇█鏀寔鍑虹幇鎴柇锟�?/p>
鏈枃灏嗘繁鍏ユ帰璁ˋPI�鍙戜腑URL缂栫爜的悇锟?锟�?锛屽苟鎻緵缁忚繃瀹炴楠岃瘉的В鍐虫柟堛�傛棤璁轰綘鏄墠绔紑鍙戣�呫�佸悗绔伐绋锛岃繕鏄叏鏍堝伐绋锛岄兘鑳戒粠鏈枃涓幏寰疄鐢ㄧ殑缁忛獙锟?/p>
涓�銆丄PI�鍙戜腑URL缂栫爜的壒娈婏拷?/h2>
1. URL缂栫爜鍦ˋPI涓殑閲嶈锟�?/h3>
API锛圓pplication Programming Interface锛槸鐜唬杞欢�鍙戜腑杩炴帴涓嶅悓荤粺的勬ˉ姊併�俇RL浣滀负API的勪富瑕佽闂柟忥紝鍏剁佸鐞嗙洿鎺ュ鍝嶅埌API的勫彲鐢ㄦ�с�佸吋�у拰叏э?/p>
API涓殑URL缂栫爜闇�瑕佽�檻的洜绱犳瘮鏅�歐eb椤甸潰鏇村澶嶆潅锟�?/p>
- 璺ㄥ钩鍙板吋瀹�эAPI鍙兘琚悇绉嶅鎴风璋冪敤锛岄渶瑕佸鐞嗕笉鍚岀殑缂▼璇█鍜屽钩锟?/li>
- 鏁版嵁屾暣鎬э繚浼犺的勬暟鎹湪鎺ユ敹绔兘澶熸纭В锟?/li>
- 瀹叏э闃叉缂爜鐩稿叧的勫畨鍏ㄦ紡锟�?/li>
- ц兘锟?/strong>厤涓嶅繀瑕佺殑缂爜艰URL杩囬
2. API URL的勭粨锟?/h3>
涓�涓鍨殑RESTful API URL缁撴濡備笅锟?/p>
https://api.example.com/v1/users/123/profile?token=abc123&fields=name,email,phone
URL的勫悇涓儴鍒嗛兘鍙兘闇�瑕佺佸鐞嗭
- 鍗忚鍜屽煙鍚嶏父涓嶉渶瑕佺锟�?/li>
- API鐗堟湰锟?/strong>父浣跨敤瀛瘝鏁板瓧锛屼笉闇�瑕佺锟�?/li>
- 璺緞鍙傛暟锟�?/strong>锟�? users/123涓123
- 璧勬鏍囪瘑绗︼細濡備腑鏂囩敤鎴峰悕銆佺娈奍D锟�?/li>
- 鏌ヨ鍙傛暟锟�?/strong>閿�煎褰㈠紡浼犻�掔殑鏁版
- Fragment锟�?/strong>ㄤ簬瀹㈡埛绔鑸紝閫父涓嶅湪鏈嶅姟鍣ㄧ澶勭
3. URL缂栫爜的锟�?/h3>
鍦ˋPI�鍙戜腑锛RL缂栫爜闈复的富瑕佹鎴樺寘鎷細
- 瀛闆嗕笉涓�鑷达細涓嶅悓绯荤粺浣跨敤涓嶅悓的勯璁ゅ瓧绗﹂泦
- 缂栫爜标准噯宸紓锟?/strong>涓嶅悓璇█鍜屾鏋剁殑缂栫爜炵幇鍙兘鏈樊锟�?/li>
- 宓屽缂爜锟?/strong>鏁版嵁鍙兘缁忚繃澶眰缂
- 鐗畩鍦烘櫙锟?/strong>濡傛枃浠朵笂浼犮�佸璇█寔銆佷簩杩涘埗鏁版嵁锟?/li>
浜屻�佹煡璇㈠弬鏁扮殑缂爜澶
1. 鏌ヨ鍙傛暟缂栫爜鍩虹
鏌ヨ鍙傛暟鏄疉PI涓渶甯哥敤的勬暟鎹紶掓柟忥紝鍏剁渶瑕佺鍒敞鎰忥
# 鏌ヨ鍙傛暟的刄RL缁撴
?key1=value1&key2=value2&key3=value3
姣忎釜鏌鍙傛暟鐢遍鍊煎缁勬垚锛岄敭鍜屽�奸兘闇�瑕佺紪侊細
# 鍘熷URL
https://api.example.com/search?q=Python鏁欑&page=1
# 缂栫爜鍚庣殑URL
https://api.example.com/search?q=Python%E6%95%99%E7%A8%8B&page=1
2. 鏌ヨ鍙傛暟缂栫爜的父瑙敊锟?/h3>
閿欒涓�锛彧缂爜鍊间笉缂栫爜锟?/h4>
寰堝�鍙戣�彧鍏敞鍙傛暟鍊肩殑缂爜锛屽拷鐣ヤ簡鍙傛暟閿殑缂爜锟?/p>
# 閿欒绀轰緥锛氬鏁伴鍖呭惈鐗规畩瀛浣嗘缂栫
https://api.example.com/search?q=test&user name=john
# 姝g‘鍋硶锛鏁伴涔熼渶瑕佺紪锟�?
https://api.example.com/search?q=test&user%20name=john
閿欒浜岋細閲嶅缂
瀵瑰凡缁忕紪佺殑瀛涓插娆$侊細
# 鍘熷锟?
q=浣犲
# 绗竴娆$紪锟�?
q=%E4%BD%A0%E5%A5%BD
# 閿欒锛娆$锟�?
q=%25E4%25BD%25A0%25E5%25A5%25BD # %琚佹垚%25
# 姝g‘锛彧缂爜涓�锟?
q=%E4%BD%A0%E5%A5%BD
閿欒涓夛細缂栫爜闆嗕笉涓�锟?/h4>
鍓嶇浣跨UTF-8缂栫爜锛屽悗绔娇鐢℅BK瑙g爜锟?/p>
# 鍓嶇锛圝avaScript锛岄璁TF-8锟�?
encodeURIComponent('浣犲') // "%E4%BD%A0%E5%A5%BD"
# 鍚庣锛圥ython锛屼娇鐢℅BK瑙g爜锟?
urllib.parse.unquote('%E4%BD%A0%E5%A5%BD', encoding='gbk') // 涔辩爜锟?
3. 鏌ヨ鍙傛暟缂栫爜的渶浣冲疄锟�?/h3>
浣跨敤标准噯锟�?/h4>
粓浣跨敤璇█鎻緵的爣鍑RL缂栫爜搴擄紝涓嶈鑷繁鎵姩澶悊锟?/p>
# JavaScript
const params = new URLSearchParams();
params.append('q', 'Python鏁欑');
params.append('page', '1');
const url = `https://api.example.com/search?${params.toString()}`;
// 鑷姩澶悊缂
# Python
from urllib.parse import urlencode, quote
params = {'q': 'Python鏁欑', 'page': 1}
query_string = urlencode(params) # 鑷姩澶悊缂
url = f"https://api.example.com/search?{query_string}"
缁熶竴锟�?/h4>
繚鍓嶅悗绔娇ㄧ浉鍚岀殑闆嗭紙鎺ㄨ崘UTF-8锛細
# Python Flask 璁剧
app.config['JSON_AS_ASCII'] = False
app.config['RESTful_API_ENCODING'] = 'utf-8'
# Java Spring Boot 璁剧
server.tomcat.uri-encoding=UTF-8
涓�佽矾寰勫鏁扮殑缂爜澶
1. RESTful API涓殑璺緞鍙傛
鍦≧ESTful API涓紝璺緞鍙傛暟鐢ㄤ簬鏍囪瘑鐗瑰畾璧勬锟�?/p>
# 鑾峰彇鐗瑰畾ㄦ埛
GET /users/123
# 鑾峰彇鐗瑰畾鏂囩
GET /articles/python-tutorial
# 鑾峰彇鐗瑰畾鏂囦
GET /files/骞村害鎶ュ憡-2026.pdf
2. 璺緞鍙傛暟缂栫爜的锟�?/h3>
鏂滄闂
URL涓殑鏂滄潬锟�?锛槸璺緞鍒嗛绗︼紝涓嶈兘鍑虹幇鍦ㄨ矾勫鏁腑锟�?/p>
# 閿欒锛枃浠跺悕鍖呭惈鏂滄潬
GET /files/2026/骞村害鎶ュ憡.pdf # 鏈嶅姟鍣ㄤ細璁や负璺緞锟�?/files/2026/
# 姝g‘锛氱紪佹枩锟�?
GET /files/2026%2F%E5%B9%B4%E5%BA%A6%E6%8A%A5%E5%91%8A.pdf
涓枃闂
涓枃璺緞鍙傛暟闇�瑕佺鍒敞鎰忕侊細
# 鍘熷璺緞
GET /articles/Python鏁欑
# 缂栫爜锟?
GET /articles/Python%E6%95%99%E7%A8%8B
3. 璺緞鍙傛暟缂栫爜的渶浣冲疄锟�?/h3>
浣跨URL瀹叏的勬爣璇嗙
灏介噺浣跨敤鏁板ID鎴栧瓧姣嶆暟瀛爣璇嗙锛岄伩鍏嶇洿鎺ヤ娇ㄤ腑鏂囨垨鐗规畩瀛锟�?/p>
# 鎺ㄨ崘鍋硶锛娇鐢↖D
GET /users/123
# 涓嶆帹鑽愶細鐩存帴浣跨敤涓
GET /users/犱笁 # 鍙兘艰嚧鍚闂
# 鎶樹腑鏂规锛氫娇鐢ㄧ紪佸悗的処D
GET /users/%E5%BC%A0%E4%B8%89 # 闇�瑕佹纭锟�?
璺緞鍙傛暟鍗曠缂栫
瀵矾寰勫鏁拌繘琛屽崟鐙侊細
# JavaScript
const username = '犱笁';
const encodedUsername = encodeURIComponent(username);
const url = `https://api.example.com/users/${encodedUsername}`;
# Python
from urllib.parse import quote
username = '犱笁'
encoded_username = quote(username, safe='')
url = f"https://api.example.com/users/{encoded_username}"
鍥涖�丷ESTful API缂栫爜瑙
1. RFC 3986标准
RESTful API的刄RL缂栫爜搴旇靛惊RFC 3986标准锟�?/p>
# RFC 3986 淇濈瀛
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
# 闈炰繚鐣欏瓧绗︿笉闇�瑕佺紪锟�?
# 鍏朵瀛蹇呴』缂
2. API鐗堟湰鎺у埗涓殑缂栫
API鐗堟湰鍙烽�父涓嶉渶瑕佺侊紝浣嗚娉ㄦ剰鏍煎紡锟?/p>
# 鎺ㄨ崘的増鏈牸锟�?
GET /v1/users # 浣跨敤灏忓啓瀛瘝
GET /v2/articles # 鐗堟湰涔棿淇濇寔涓�锟�?
# 涓嶆帹鑽殑鏍煎紡
GET /V1/users # 澶у啓V
GET /v1.0/users # 鏁扮
3. 鍒嗛〉鍙傛暟的勭锟�?/h3>
鍒嗛〉鏄疉PI的勫父瑙渶姹傦紝缂栫爜鏃堕渶瑕佹敞鎰忥細
# 标准鍒嗛〉鍙傛暟
GET /articles?page=1&per_page=20
# ︽帓搴忕殑鍒嗛
GET /articles?page=1&per_page=20&sort=created_at&order=desc
# 鐗畩鍊肩殑缂
GET /articles?tags=%E5%BF%83%E7%90%86,%E7%A4%BE%E4%BC%9A # 澶氫釜鏍囩ㄩ�彿鍒嗛
4. 杩囨护鍜屾悳绱㈠鏁扮殑缂
澶嶆潅的繃ゅ拰鎼滅储鏉闇�瑕佷粩缁嗙侊細
# 杩囨护鏉′
GET /products?category=鐢靛瓙浜у&brand=鑻灉&price_min=1000&price_max=5000
# 鎼滅储鏉′
GET /articles?q=Python%E7%BC%96%E7%A8%8B&fields=title,content,author
# 鏃ユ湡鑼冨洿
GET /events?start_date=2026-01-01&end_date=2026-12-31
浜斻�佸父瑙棶棰樹笌瑙e喅鏂规
1. 涓枃涔辩爜闂
涓枃涔辩爜鏄疉PI�鍙戜腑鏈�歌的勯棶棰樹涓�锟?/p>
闂鍘熷洜
- 鍓嶅悗绔瓧绗﹂泦涓嶄锟?/li>
- 澶氭缂爜鎴敊璇紪锟�?/li>
- 鐗畩瀛澶勭悊涓嶅綋
瑙e喅鏂规
# 缁熶竴浣跨敤UTF-8缂栫
# Node.js Express
app.use((req, res, next) => {
req.setEncoding('utf8');
next();
});
# Python Flask
from flask import Flask, request
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
# Java Spring Boot
@RestController
public class ApiController {
@RequestMapping(value = "/api/**", produces = "application/json; charset=UTF-8")
public String api() {
return "UTF-8鍝嶅";
}
}
2. 鐗畩瀛瀵艰嚧瑙f澶
鏌愪簺鐗规畩瀛鍦║RL涓湁鐗规畩鍚箟锛岄渶瑕佺壒鍒敞鎰忥
闇�瑕佺佺殑鐗畩瀛
# & 绗﹀ - 鍙傛暟鍒嗛锟?
# 濡傛灉鍊间腑鍖呭&锛屽椤荤锟�?
?search=Tom%26Jerry
# = 绗﹀ - 閿�煎鍒嗛殧锟?
# 濡傛灉鍊间腑鍖呭=锛屽椤荤锟�?
?value=a%3Db
# + 绗﹀ - 绌烘牸的紶缁熻锟?
# 濡傛灉鍊间腑鍖呭+锛岀佸悗锟�?2B
?code=a%2Bb
# # 绗﹀ - Fragment鍒嗛殧锟?
# 缂栫爜鍚庢槸%23
?hash=abc%23def
3. URL害闄埗闂
娴忚鍣ㄥ拰鏈嶅姟鍣ㄥURL害鏈夐鍒讹細
- 娴忚鍣ㄩ鍒讹細澶у鏁版祻瑙堝櫒闄愬埗URL害锟?000涓瓧绗乏锟?/li>
- 鏈嶅姟鍣ㄩ鍒讹細Apache榛闄愬8190瀛妭锛ginx榛闄愬8KB
- 瑙e喅鏂规硶锟�?/strong>瀵簬澶ч噺鏁版嵁锛屼娇鐢≒OST鏂硶灏嗘暟鎹斁鍦ㄨ姹備綋锟?/li>
# 涓嶆帹鑽愶細URL杩囬
GET /api/search?q=verylongquerywithlotsofparameters...
# 鎺ㄨ崘锛娇鐢≒OST鏂硶
POST /api/search
Content-Type: application/x-www-form-urlencoded
q=verylongquerywithlotsofparameters...
4. 澶氳瑷�鏀寔闂
鍦ㄥ浗闄寲API涓紝闇�瑕佹敮鎸佸绉嶈瑷�的勬煡璇
# 涓枃鏌
GET /api/search?q=%E4%B8%AD%E6%96%87
# 鏃ユ枃鏌
GET /api/search?q=%E6%97%A5%E6%96%87
# 闊╂枃鏌
GET /api/search?q=%E9%9F%A9%E6%96%87
# 娣峰悎鏌
GET /api/search?q=Hello%20World%20%E4%B8%AD%E6%96%87
5. 鏃ユ湡鍜屾闂村弬鏁扮锟�?/h3>
鏃ユ湡鏃堕棿鍙傛暟闇�瑕伒狪SO 8601标准锟�?/p>
# 鎺ㄨ崘锛欼SO 8601鏍煎紡锛圲RL瀹叏锟�?
GET /api/events?start=2026-01-01T00%3A00%3A00Z
# 涓嶆帹鑽愶細鍏朵鏍煎
GET /api/events?start=2026/01/01%2012%3A00%3A00
# 鏃ユ湡鑼冨洿鏌ヨ
GET /api/orders?from=2026-01-01&to=2026-12-31
鍏�佸畨鍏�冭
1. URL娉ㄥ叆鏀诲嚮
鏈纭鐞嗙殑URL缂栫爜鍙兘瀵艰嚧娉ㄥ叆诲嚮锟�?/p>
SQL娉ㄥ叆庨
鍗充娇浣跨敤鍙傛暟鍖栨煡璇紝URL鍙傛暟涔熼渶瑕侀獙璇佸拰缂栫爜锟?/p>
# 舵剰杈撳
?q=1%3BDROP%20TABLE%20users--
# 瑙g爜鍚庡彲鑳介�犳垚鐮村潖
?q=1;DROP TABLE users--
# 闃插尽鎺柦锛氫弗鏍奸獙璇佽锟�?
def validate_param(param):
allowed_chars = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_~')
return all(c in allowed_chars for c in param)
2. XSS诲嚮椋庨
URL鍙傛暟鍙兘鍦ㄥ搷搴斾腑鍥炴樉锛岄渶瑕侀槻SS锟�?/p>
# 舵剰杈撳
?q=
# 缂栫爜鍚庡瓨锟�?鏄剧
?q=%3Cscript%3Ealert%28%27xss%27%29%3C%2Fscript%3E
# 鍦℉TML涓樉绀烘闇�瑕丠TML缂栫
<script>alert('xss')</script>
3. 鏁忔劅鏁版嵁澶勭
鏁忔劅鏁版嵁涓嶅簲璇ラ�氳繃URL浼犻�掞
- 瀵嗙爜锟?/strong>浣跨POST鏂硶鎴栬姹傚ご浼狅拷?/li>
- Token锟�?/strong>浼樺厛浣跨敤Authorization锟�?/li>
- 鏁忔劅ID锟�?/strong>鑰冭檻鍔犲瘑鎴栦娇鐢ㄤ娆℃�ф爣璇嗙
# 涓嶆帹鑽愶細氳繃URL浼犻�掓晱鎰熶俊锟�?
GET /api/user/123?token=abc123&password=secret
# 鎺ㄨ崘锛娇鐢姹傚
GET /api/user/123
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
# 鎴栦娇鐢≒OST鏂硶
POST /api/login
Content-Type: application/x-www-form-urlencoded
username=user&password=secret
涓冦�佸疄鎴樻锟�?/h2>
妗堜緥涓�锛悳绱㈠鑳藉紑锟�?/h3>
瀹炵幇涓�涓敮鎸佸璇█的勬悳绱PI锟�?/p>
# 璇锋眰绀轰緥
GET /api/v1/search?q=%E6%96%AF%E5%9D%97%E5%9B%BE%E5%BA%93&lang=zh&page=1&per_page=20
# Node.js瀹炵
app.get('/api/v1/search', async (req, res) => {
const { q, lang = 'en', page = 1, per_page = 20 } = req.query;
// 楠岃瘉鍙傛暟
if (!q || typeof q !== 'string') {
return res.status(400).json({ error: 'Missing query parameter' });
}
// 瑙g爜骞堕獙璇佹煡锟?
const query = decodeURIComponent(q);
const pageNum = parseInt(page, 10);
const limit = Math.min(parseInt(per_page, 10), 100);
try {
const results = await searchService.search({
query,
language: lang,
offset: (pageNum - 1) * limit,
limit
});
res.json({
success: true,
data: results,
pagination: {
page: pageNum,
per_page: limit,
total: results.total
}
});
} catch (error) {
res.status(500).json({ error: 'Search failed' });
}
});
妗堜緥浜岋細鏂囦欢涓婁紶API
瀹炵幇鏂囦涓婁紶API锛屾敞鎰忔枃浠跺悕缂爜锟?/p>
# 璇锋眰绀轰緥
POST /api/v1/files
Content-Type: multipart/form-data
file: (binary)
filename: %E6%8A%A5%E5%91%8A-2026.pdf
# Node.js瀹炵
const multer = require('multer');
const path = require('path');
const storage = multer.diskStorage({
destination: './uploads',
filename: (req, file, cb) => {
// 姝g‘澶悊鏂囦鍚嶇紪锟�?
const originalName = Buffer.from(file.originalname, 'latin1').toString('utf8');
const safeName = originalName.replace(/[^a-zA-Z0-9\u4e00-\u9fa5.-]/g, '_');
cb(null, `${Date.now()}-${safeName}`);
}
});
const upload = multer({ storage });
app.post('/api/v1/files', upload.single('file'), (req, res) => {
res.json({
success: true,
file: {
id: req.file.filename,
original_name: req.file.originalname,
size: req.file.size
}
});
});
鍏�佸伐鍏锋帹锟�?/h2>
鍦ˋPI�鍙戜腑锛屼娇鐢ㄥ悎傜殑宸ュ叿鍙互澶уぇ鎻愰鏁堢巼锟?/p>
🦘憠 绔嵆浣跨敤锟�?/strong>URL 缂栬В锟�?/a>
�鍙戝伐鍏锋帹锟?/h3>
- Postman锟�?/strong>哄ぇ的凙PI娴宸ュ叿锛岃嚜鍔ㄥ鐞RL缂栫
- curl锟�?/strong>鍛戒护琛屽伐鍏凤紝鏀寔鍚勭缂爜閫夐
- 在线URL缂栬В佸伐鍏凤蹇�熸祴璇曞拰璋冭
涔濄�佺粨锟?/h2>
URL缂栫爜鍦ˋPI�鍙戜腑鏄竴涓熀�浣嗛噸瑕佺殑涓婚銆傛纭鐞哢RL缂栫爜鍙互厤堝妫樻的棶棰橈紝鎻愰珮API的勫彲鐢ㄦ�у拰叏э?/p>
鏈枃鎬荤粨的勫叧閿偣锟�?/p>
- 缁熶竴闆嗭粓浣跨敤UTF-8
- 浣跨敤标准噯搴擄涓嶈鑷繁鎵姩澶悊缂
- 厤閲嶅缂栫爜锟?/strong>鍙佷锟?/li>
- 娉ㄦ剰璺緞鍙傛暟锟?/strong>璺緞涓殑鐗畩瀛闇�瑕侀澶栨敞锟�?/li>
- 瀹叏绗竴锟?/strong>鏁忔劅鏁版嵁涓嶈閫氳繃URL浼狅?/li>
- 娴鍚勭鍦烘櫙锟�?/strong>鍖呮涓枃銆佺娈婂瓧绗︺�佸璇█锟�?/li>
屾湜鏈枃鑳藉姪浣犳洿濂藉湴澶勭悊API�鍙戜腑的刄RL缂栫爜闂銆傚鏋滀綘鍦ㄥ疄闄呭伐浣腑閬囧埌浜嗗叾浠佺浉鍏崇殑闂锛屾杩庝娇鐢ㄦ垜浠殑在线URL缂栬В佸伐鍏疯繘琛岃皟璇曪?/p>
🦘憠 绔嵆浣跨敤锟�?/strong>URL 缂栬В锟�?/a>