全部产品
云市场

HTTPDNS iOS、android(安卓) SDK:HTTPDNS解析完成,可以使用IP代替域名直接访问吗?

更新时间:2017-08-29 19:38:02

不能直接访问,需要设置 HTTP请求头HOST字段。标准的HTTP协议中服务端会将HTTP请求头HOST字段的值作为请求的域名信息进行解析。使用HTTPDNS后,您可能需要将HTTP请求URL中的HOST字段替换为HTTPDNS解析获得的IP,这时标准的网络库会将您的IP赋值给HTTP请求头的HOST字段,进而导致服务端的解析异常(服务端认可的是您的域名信息,而非IP信息)。为了解决这个问题,您可以主动设置HTTP请求HOST字段的值,如:

Android端:

  1. String originalUrl = "http://www.aliyun.com/";
  2. URL url = new URL(originalURL);
  3. String originalHost = url.getHost();
  4. // 异步接口获取IP
  5. String ip = httpdns.getIpsByHostAsync(originalHost);
  6. HttpURLConnection conn;
  7. if (ip != null) {
  8. // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
  9. url = new URL(originalUrl.replaceFirst(originalHost, ip));
  10. conn = (HttpURLConnection) url.openConnection();
  11. // 设置请求HOST字段
  12. conn.setRequestProperty("Host", originHost);
  13. } else {
  14. conn = (HttpURLConnection) url.openConnection();
  15. }

iOS端:

  1. NSString *originalUrl = @"http://www.aliyun.com/";
  2. NSURL* url = [NSURL URLWithString:originalUrl];
  3. NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
  4. // 同步接口获取IP
  5. NSString* ip = [httpdns getIpByHostAsync:url.host];
  6. if (ip) {
  7. // 通过HTTPDNS获取IP成功,进行URL替换和HOST头设置
  8. NSRange hostFirstRange = [originalUrl rangeOfString: url.host];
  9. if (NSNotFound != hostFirstRange.location) {
  10. NSString* newUrl = [originalUrl stringByReplacingCharactersInRange:hostFirstRange withString:ip];
  11. request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:newUrl]];
  12. // 设置请求HOST字段
  13. [request setValue:url.host forHTTPHeaderField:@"host"];
  14. }
  15. }