背景:
在通過(guò) HTTP 請(qǐng)求調(diào)用短信發(fā)送接口(single_send、batch_send、tpl_single_send、tpl_batch_send)時(shí),所有請(qǐng)求參數(shù)需要進(jìn)行 URL 編碼(urlencode)。未正確編碼可能會(huì)導(dǎo)致請(qǐng)求失敗或內(nèi)容錯(cuò)誤
常見(jiàn)問(wèn)題與解決方法:
1、報(bào)錯(cuò)提示請(qǐng)求參數(shù)缺失或未知異常
問(wèn)題描述1:
調(diào)用batch_send接口時(shí),即使已經(jīng)傳入了 apikey,仍出現(xiàn)錯(cuò)誤:參數(shù) apikey 必須傳入
錯(cuò)誤復(fù)現(xiàn)1:
問(wèn)題描述2:
調(diào)用single_send接口時(shí),已傳入?yún)?shù)卻出現(xiàn)錯(cuò)誤:未知異常
錯(cuò)誤復(fù)現(xiàn)2:
原因分析:
調(diào)用云片發(fā)送接口需要使用application/x-www-form-urlencoded格式傳參,示例中雖然header中傳入了Content-Type: application/x-www-form-urlencoded,但實(shí)際請(qǐng)求body還是使用的json格式,導(dǎo)致的報(bào)錯(cuò)
解決方法:
在發(fā)送請(qǐng)求時(shí),務(wù)必對(duì)所有參數(shù)值(包括 apikey)進(jìn)行urlencode,并確保請(qǐng)求體的格式符合 key=value 的鍵值對(duì)標(biāo)準(zhǔn)。建議使用合適的編碼工具或庫(kù):
Java: URLEncoder.encode(value, "UTF-8")
Python: urllib.parse.quote(value)
JavaScript: encodeURIComponent(value)
2、短信內(nèi)容缺失或顯示錯(cuò)誤
問(wèn)題描述1:
調(diào)用 single_send 接口時(shí),發(fā)送的短信內(nèi)容部分丟失。例如:
- 輸入:a1%123
- 輸出:a13(%12 被誤解為特殊字符導(dǎo)致問(wèn)題)
錯(cuò)誤復(fù)現(xiàn)1:
問(wèn)題描述2:
調(diào)用 tpl_single_send 接口時(shí),已對(duì)參數(shù)做了urlencode,可實(shí)際下發(fā)的短信內(nèi)容仍然缺失或內(nèi)容有誤
錯(cuò)誤復(fù)現(xiàn)2:
原因分析:
特殊字符(如 %、& 等)未進(jìn)行 URL 編碼,服務(wù)器誤解析這些符號(hào)為特殊指令
錯(cuò)誤復(fù)現(xiàn)1中,a1%123 和 a2%456 中的%12 和 %45 被錯(cuò)誤解析,導(dǎo)致后續(xù)內(nèi)容被截?cái)嗷蛱鎿Q
--(a1%123的 %12 在 ASCII 表中對(duì)應(yīng)換節(jié)符,通常被處理為無(wú)效,所以變成了 a13。a2%456的 %45 被解析為 ASCII 表中的 E,所以變成了 a2E6)
錯(cuò)誤復(fù)現(xiàn)2中,由于僅對(duì)整個(gè)參數(shù)進(jìn)行一次編碼,未對(duì)內(nèi)嵌的“%”進(jìn)行保護(hù)性編碼,從而被錯(cuò)誤解析
解決方法:
對(duì)短信內(nèi)容進(jìn)行urlencode,確保所有字符被安全傳遞。在調(diào)用指定模板發(fā)送接口(tpl_single_send、tpl_batch_send)時(shí),需要對(duì)變量名和變量值分別進(jìn)行 urlencode 再傳遞。
建議:
- 始終對(duì)參數(shù)進(jìn)行 URL 編碼:避免 %、&、= 等特殊字符導(dǎo)致問(wèn)題;
- 驗(yàn)證請(qǐng)求格式:確保請(qǐng)求體為 key=value 格式,參數(shù)之間用 & 分隔;
- 使用編碼工具:使用編程語(yǔ)言內(nèi)置的 urlencode 方法,減少手動(dòng)錯(cuò)誤。