本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
本文檔介紹如何調用解析服務,解析單個域名。
API訪問說明
直接使用 HTTP API 時,務必遵循最佳實踐建議,否則存在業務故障風險。
HTTPDNS通過HTTP接口提供域名解析服務,服務接入地址使用IP直連的形式。務必參考獲取解析服務地址,實時獲取就近服務接入地址。
這里以203.107.XXX.XXX
這個服務IP為例,說明HTTPDNS服務的訪問方式。
請求方式:HTTP GET或HTTPS GET(兩種請求方式的收費價格不同,具體請參考產品計費)
HTTP服務URL:http://203.107.XXX.XXX/{account_id}/d
HTTPS服務URL:https://203.107.XXX.XXX/{account_id}/d
其中的{account_id}
需要替換為用戶的HTTPDNS Account ID
,在HTTPDNS控制臺上可以獲得這個ID。
URL參數說明:
名稱 | 是否必須 | 描述 |
host | 必須 | 要解析的域名。 |
ip | 可選 | 用戶的來源IP,如果沒指定這個參數,默認使用請求連接的源IP。 |
query | 可選 | 指定解析結果IP的類型,可以選擇6(IPv6)或4(IPv4)。 默認值為4。 |
該接口訪問HTTPDNS服務時,一次請求只能解析一個域名。
請求示例:
示例1(默認來源IP):http://203.107.XXX.XXX/100000/d?host=www.aliyun.com
示例2(指定來源IP):http://203.107.XXX.XXX/100000/d?host=www.aliyun.com&ip=42.120.XX.XXX
示例3(指定解析類型):http://203.107.XXX.XXX/100000/d?host=www.aliyun.com&ip=219.242.XXX.XXX&query=4,6
示例4 (支持IPv6):http://[2401:b180:2000:XXXX:XXXX]/100000/d?host=www.aliyun.com&ip=219.242.XXX.XXX&query=4,6
API響應說明
請求成功
請求成功時,HTTP響應的狀態碼為200,響應結果用JSON格式表示,示例如下:
{ "host":"www.aliyun.com", "ips":[ "192.168.XX.234" ], "ipsv6":[ "2400:3200:1300:0:0:0:XX:XX" ], "ttl":57, "origin_ttl":120 }
返回字段說明:
名稱
描述
host
請求解析的域名。
ips
該域名的IPv4解析結果,是一個列表,可能包括0個、1個或多個IP地址;僅當query=4時返回這個字段。
ipsv6
該域名的IPv6解析結果,是一個列表,可能包括0個、1個或多個IP地址;僅當query=6時返回這個字段。
ttl
該域名解析結果的TTL緩存時間。
origin_ttl
域名原始TTL,即權威NS上配置的域名TTL值
重要因服務后端對不同域名的解析方式不同,可能沒法獲得域名的這個TTL值,此時不返回這個字段。
請求成功時,返回結果中的
ips
字段可能是空列表,即沒有獲得該域名的IP地址,這里主要有兩個原因:該域名沒有在HTTPDNS控制臺中添加,請前往控制臺添加。
該域名不存在對應IP,域名未注冊,或者沒有配置IP地址。
ips
字段為空的返回結果示例:{ "host":"www.aliyun.com", "ips":[], "ttl":300 }
返回結果中包含TTL緩存時間,為避免頻繁進行域名解析,用戶應該按這個TTL時間,對域名解析結果進行緩存。在TTL過期之前,直接使用緩存的IP;TTL過期后,再去請求HTTPDNS服務,獲得最新的解析結果。
請求失敗
請求失敗時,HTTP響應的狀態碼為4xx/5xx,同時也返回具體的錯誤碼,響應結果用JSON格式表示。
請求失敗的響應示例:
{ "code": "MissingArgument" }
錯誤碼列表如下:
錯誤碼
HTTP狀態碼
描述
MissingArgument
400
缺少必要參數。
InvalidHost
400
域名格式不合法。
TooManyHosts
400
單域名解析接口傳遞了多個待解析域名。
SdnsNotSupported
400
海外暫不支持SDNS服務。
InvalidAccount
403
無效賬戶或賬戶不存在。
MethodNotAllowed
405
不支持的HTTP方法。
InternalError
500
服務端內部錯誤。
錯誤處理說明
用戶業務使用HTTPDNS時,應做好異常情況下的出錯兼容邏輯,主要包括異步請求、重試和降級。
異步請求
訪問HTTPDNS服務時,應該使用異步請求的策略,避免解析延遲太大而對業務造成影響,特別是在網絡環境異常或HTTPDNS服務IP異常不可用時,如果用同步訪問,需要等待網絡超時后才會返回解析失敗,這個超時時間較大,可能對業務的使用體驗造成很大影響。
異步請求策略:解析域名時,如果當前緩存中有TTL未過期的IP,可直接使用;如果沒有,則立刻讓此次請求降級走原生LocalDNS解析,同時另起線程異步地發起HTTPDNS請求進行解析,更新緩存,這樣后續解析域名時就能命中緩存。
重試
訪問HTTPDNS服務解析域名時,如果請求HTTPDNS服務端失敗,即HTTP請求沒有返回,可以進行重試。
大部分情況下,這種訪問失敗是由于網絡原因引起的,重試可以解決。
降級
當通過HTTPDNS服務無法獲得域名對應的IP時,都必須降級:使用標準的DNS解析,通過Local DNS去解析域名。
請求HTTPDNS但沒有返回IP時,主要是因為“域名沒有在控制臺添加”或“域名本身不存在”,無論什么原因,如果通過HTTPDNS沒有解析出IP,為保證業務請求正常,必須降級使用標準的DNS,作為兜底方案。
注意事項
HTTP請求頭HOST字段設置
標準的HTTP協議中服務端會將HTTP請求頭HOST字段的值作為請求的域名信息進行解析。
使用HTTPDNS后,您可能需要將HTTP請求URL中的HOST字段替換為HTTPDNS解析獲得的IP,這時標準的網絡庫會將您的IP賦值給HTTP請求頭的HOST字段,進而導致服務端的解析異常(服務端認可的是您的域名信息,而非IP信息)。
為了解決這個問題,您可以主動設置HTTP請求HOST字段的值(網站使用阿里云Web應用防火墻(WAF)防護時,需要在Host中指定為原來的域名)。以HttpUrlConnection為例:
// 比如您要訪問http://www.example.com/,假設www.example.com域名的解析結果是192.168.XX.XX。 // 一般情況下,使用IP的方式進行訪問時,需要設置HTTP請求頭的HOST字段為原來的域名。 String fullPath ="http://192.168.XX.XX/"; String host ="www.example.com"; URL url =new URL(fullPath); HttpURLConnection conn =(HttpURLConnection) url.openConnection(); // 設置HTTP請求頭HOST字段為www.example.com conn.setRequestProperty("Host", host);
COOKIE字段
部分網絡庫支持COOKIE的自動存儲管理,當您使用HTTPDNS進行IP URL請求時,部分網絡庫會將您URL中的IP信息作為COOKIE對應的域名信息進行存儲管理(而非HTTP請求頭HOST字段信息),進而造成COOKIE管理與使用上的困擾,因此您需要關閉COOKIE的自動管理功能(默認關閉)。
HTTPS域名下的使用
在使用HTTPS服務時本地認證證書環節需要確認您的訪問域名是否和證書一致,采用IP URL發起請求時系統網絡庫會使用IP信息進行驗證進而發生異常。針對該問題,有以下兩種解決方案:
建議您在進行HTTPS服務時關閉HTTPDNS功能。
更改客戶端驗證證書的邏輯,可參考Android端HTTPS(含SNI)業務場景:IP直連方案/iOS端HTTPS場景使用HTTPDNS。
代理情況下的使用
當存在中間HTTP代理時,客戶端發起的請求中請求行會使用絕對路徑的URL,在您開啟HTTPDNS并采用IP URL進行訪問時,中間代理將識別您的IP信息并將其作為真實訪問的HOST信息傳遞給目標服務器,這時目標服務器將無法處理這類無真實HOST信息的HTTP請求。針對該問題,有以下2種解決方案:
使用原生的DNS解析規避該問題。
修改服務端配置,使用類似于WAP網關(見以下介紹)在header字段中增加其他字段的方式,服務端根據該私有字段進行驗證。
移動WAP網關使用了
X-Online-Host
的私有協議字段來解決這個問題,比如:目標URL:http://www.example.com/product/oss/ 通過HTTPDNS解析出來的www.example.com的IP:192.168.XX.XX 代理:10.0.XX.XX:XX 您的HTTP請求頭: GET http://192.168.XX.XX/product/oss/ HTTP/1.1 # 通過代理發起的HTTP請求頭,請求行是一個絕對路徑 Host: www.example.com # 這個Header會被代理網關忽略,代理網關會使用請求行絕對路徑中的host字段作為源站的host,即192.168.XX.XX X-Online-Host: www.example.com #這個Header就是移動網關為了傳遞真實Host添加的私有頭部,源站需要配置識別該私有頭部以獲取真實的Host信息
同樣您可以通過
setRequestProperty
方法進行X-Online-Host
請求頭域的設置。在絕大多數場景下,我們建議您在代理模式下關閉HTTPDNS功能。
鑒權方式接入:請參見鑒權解析接口。