`
haoyunlyh
  • 浏览: 11904 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读网上的URL,会出的502错误

阅读更多

 

         最近做一个项目需要调用网络上的资料,是别的公司提供的一个url接口。我们只要拼URL,然后去访问就OK了!

         看起来很简单的调用,却弄了好长时间也算搞定,但是办法也不是很好!

         一开始直接用URLConnection进行读操作。(加上代理)

java 代码
  1.   System.getProperties().put("proxySet","true");   
  2.   System.getProperties().put("proxyHost","IP");   
  3.   System.getProperties().put("proxyPort","PORT");   
  4. URLConnection huc = url.openConnection();      
  5. huc.setDoInput(true);      
  6. StringBuffer str = new StringBuffer();      
  7. BufferedReader in=new BufferedReader(new InputStreamReader(huc.getInputStream()));      
  8. String inputLine;      
  9.  while((inputLine=in.readLine())!=null)      
  10.         str.append(inputLine);      
  11.  in.close();    

           运行发现,验证用户的URL没有问题,但在读用户信息的URL时,却很长时间没有反应,过了大约5分钟左右报502错误

502:是Bad gate way    ,应该是网关错误。开始以为是我们的代理不行。然后就用拨号来试。却发现结果是相同的!

         还以为是URL错误,然后把URL打在浏览器里进行尝试,却发现成功了。

        于是认为是URLConnection这个类的功能不够强大,容错性不行。

        并下httpClient来试,(抱怨一声httpClient的版本太多了,还要code一起运行),终于写好了,尝试运行,

java 代码
  1. StringBuffer str = new StringBuffer();   
  2.             httpclient = new DefaultHttpClient();   
  3.             //httpclient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(3,true));   
  4.                
  5.             //代理   
  6.             /**HttpHost targetHost = new HttpHost("serverip",server port, "http");  
  7.             HttpHost proxy = new HttpHost("IP", port);   
  8.             HttpRoute route = new HttpRoute(targetHost, null, proxy, false);  
  9.             HttpGet httpget = new HttpGet("/path");  
  10.             RoutedRequest routedReq = new RoutedRequest.Impl(httpget, route);  
  11.             HttpResponse response = httpclient.execute(routedReq, null);*/  
  12.                
  13.             //不用代理   
  14.             HttpGet httpget = new HttpGet(urlStr);    
  15.             HttpResponse response = httpclient.execute(httpget);   
  16.   
  17.             HttpEntity entity = response.getEntity();   
  18.                
  19.                
  20.                
  21.             if (entity != null) {   
  22.                 BufferedInputStream bis = new BufferedInputStream(entity.getContent());   
  23.                    
  24.                 byte[] b = new byte[1024];   
  25.                 int i=-1;   
  26.                 while((i=bis.read(b))!=-1){   
  27.                     str.append(new String(b,0,i));   
  28.                 }   
  29.             }   
  30.                
  31.                
  32.             if (entity != null) {   
  33.                 entity.consumeContent();   
  34.             }  

          还是不行,同样的问题

 

          于是想是不是这个接口做了控制,(因为浏览器访问从来都是正确结果的),于是想办法封闭请求,便有了下面的代码

java 代码
  1. HttpHost targetHost = new HttpHost("serverip", serverpot, "http");   
  2.    HttpHost proxy = new HttpHost("ip", port);    
  3.    HttpRoute route = new HttpRoute(targetHost, null, proxy, false);   
  4.    HttpGet httpget = new HttpGet("/.......");*/   
  5.    httpget.setHeader("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");   
  6.    httpget.setHeader("Accept-Language","zh-cn");   
  7.    httpget.setHeader("UA-CPU","x86");   
  8.    httpget.setHeader("Accept-Encoding","gzip,deflate");   
  9.    httpget.setHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");   
  10.    httpget.setHeader("Host","serverip:serverpot");   
  11.    httpget.setHeader("Proxy-Connection""Keep-Alive");   
  12.    RoutedRequest routedReq = new RoutedRequest.Impl(httpget, route);  

          便下载了请求的拦截器,拦截请求,使得它发出的请求和浏览器的相同,可结果令人失望。(要绝望了)

         这时发现,httpclient的重试功能,第二次重试可以成功访问。但中间的时间却有5分钟之久,于是便想减少超时时间

         也许我没找到,或者资料不全,硬是没找到(注:httpcomponents-client-4.0-alpha1-bin,httpcomponents-core-4.0-alpha5-bin用的这两个包来做的)

         于是自己创线程20秒访问不了,就关掉上一个线程,再重试,代码下:

java 代码
  1. public void run(){   
  2.            
  3.         if(isReader){   
  4.             t.cancel();   
  5.         }else{   
  6.                
  7.             /**  
  8.              * 关闭  
  9.              */  
  10.             if(httpclient != null){   
  11.                 httpclient.getConnectionManager().shutdown();   
  12.                 //System.out.println("关闭连接");   
  13.             }   
  14.         }   
  15.     }   
  16.     public void process(){   
  17.            
  18.         try{   
  19.   
  20.             /**  
  21.              * 开始连接  
  22.              */  
  23.             String para = this.getParam(paras);   
  24.             if(para.length()!=0){   
  25.                 urlStr = urlStr + "?" +para;   
  26.             }   
  27.                
  28.             //System.out.println(new Date());   
  29.             //System.out.println(urlStr);   
  30.                
  31.             StringBuffer str = new StringBuffer();   
  32.             httpclient = new DefaultHttpClient();   
  33.             //httpclient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(3,true));   
  34.                
  35.             //代理   
  36.             /**HttpHost targetHost = new HttpHost("servertip", serverport, "http");  
  37.             HttpHost proxy = new HttpHost("ip", port);   
  38.             HttpRoute route = new HttpRoute(targetHost, null, proxy, false);  
  39.             HttpGet httpget = new HttpGet("/.......");  
  40.             RoutedRequest routedReq = new RoutedRequest.Impl(httpget, route);  
  41.             HttpResponse response = httpclient.execute(routedReq, null);*/  
  42.                
  43.             //不用代理   
  44.             HttpGet httpget = new HttpGet(urlStr);    
  45.             HttpResponse response = httpclient.execute(httpget);   
  46.   
  47.             HttpEntity entity = response.getEntity();   
  48.                
  49.                
  50.                
  51.             if (entity != null) {   
  52.                 BufferedInputStream bis = new BufferedInputStream(entity.getContent());   
  53.                    
  54.                 byte[] b = new byte[1024];   
  55.                 int i=-1;   
  56.                 while((i=bis.read(b))!=-1){   
  57.                     str.append(new String(b,0,i));   
  58.                 }   
  59.             }   
  60.                
  61.                
  62.             if (entity != null) {   
  63.                 entity.consumeContent();   
  64.             }   
  65.                
  66.             if(str.indexOf("<rawdata></rawdata>")!=-1){   
  67.                     str.delete(str.indexOf("<rawdata></rawdata>"), str.indexOf("")+"".length());   
  68.             }   
  69.             String xmlStr = this.toUnicode(str.toString(), "gb2312");   
  70.             InputStream sbis = new StringBufferInputStream(xmlStr);   
  71.             //System.out.println(xmlStr);   
  72.             //System.out.println(new Date());   
  73.             DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();   
  74.             DocumentBuilder db=dbf.newDocumentBuilder();   
  75.             doc=db.parse(sbis);   
  76.             //is.close();   
  77.             sbis.close();   
  78.             this.isReader = true;   
  79.         }      
  80.         catch(Exception e)      
  81.         {      
  82.             //log.error(e);   
  83.             //e.printStackTrace();     
  84.             process();   
  85.         }      
  86.         finally      
  87.         {      
  88.                
  89.         }   
  90.     }   
  91.     public Document processUrl(String urlStr,Map paras){   
  92.         this.urlStr = urlStr;   
  93.         this.paras = paras;   
  94.            
  95.         t = new Timer();   
  96.         t.schedule(this,50005000);   
  97.            
  98.         //this.run();   
  99.         this.process();   
  100.            
  101.         t.cancel();   
  102. }   
  103. private   String   toUnicode(String   strText,String   code)   throws   UnsupportedEncodingException{        
  104.         char   c;        
  105.           String   strRet   =   ""   ;        
  106.           int   intAsc;        
  107.           String   strHex;        
  108.           strText   =   new   String(strText.getBytes("gb2312"),code);        
  109.           for   (   int   i   =   0;   i   <   strText.length();   i++   ){        
  110.           c   =   strText.charAt(i);        
  111.           intAsc   =   (int)c;        
  112.           if(intAsc>128){        
  113.           strHex   =   Integer.toHexString(intAsc);        
  114.           strRet   =   strRet   +   "&#x"   +   strHex+";";        
  115.           }        
  116.           else{        
  117.           strRet   =   strRet   +   c;        
  118.           }        
  119.           }        
  120.           return   strRet   ;        
  121.       }   

   运行了一下,结果还行,就是这个办法不规范啊!(最后还有编码问题,郁闷死了)。唉!

    还有关于这个问题,我了贴子问问的,可怎么老是被放到入门贴呢,还扣分。呵呵。但问题总算有个说法了!

分享到:
评论
1 楼 denghan 2008-11-10  
同问,我最近也遇到了类似的问题。我的是要访问一个要需要登录验证的站点,登录后再从一个URL获取数据。用了httpclient3,httpclient4.0_beta3,都不行,登录后打开URL获取数据这一步总是5分钟左右无响应,然后报502错误

相关推荐

    urlcode解码-HTTP:URL编码解码

    URL解码则相反,它将编码后的URL还原成可读的形式。解码时,会找到所有形如"%xy"的序列,将它们转换回对应的ASCII字符。例如,"%20"会被转换为空格。 在编程中,许多语言都提供了内置函数来处理URL编码和解码。例如...

    URL 重写类 url class

    标题 "URL 重写类 url class" 涉及的核心技术是 URL 重写,这是一种优化网站 URL 结构,使其更美观、更易读的方法。在网页开发中,URL 重写通常用于实现 SEO(搜索引擎优化)友好和用户友好的网址。通过 URL 重写,...

    URL编码解码小程序

    解码时,程序会将URL编码的字符串还原为可读的字符形式。这对于开发者、网页设计师或者需要处理URL的任何人来说都非常实用,例如在处理查询参数、构建链接或分析网页请求时。 在标签“URL编码”下,我们可以进一步...

    URL重写概念和例子

    这样的改动不仅使得URL更加简洁易读,同时也有利于网站的管理和用户的友好体验。 #### 三、URL标准化 **URL标准化**是为了避免搜索引擎对同一内容的多个URL进行重复抓取和索引,从而导致权重分散的问题。例如,...

    所有Url转移字符表

    URL编码是为了使URL在网络传输中可读和可解析,而HTML编码则是在HTML文档中防止浏览器错误解析字符,比如防止`被解析为开始标签。 总的来说,URL转义字符是URL编码的核心,它使得URL能够安全地包含各种字符,无论是...

    自己写的url重写

    URL重写是Web开发中的一种技术,主要用于优化和简化用户在浏览器中输入的网址,使其更易读、更美观。这种技术通常与服务器配置、尤其是Apache HTTP Server或IIS等Web服务器上的设置密切相关。在本案例中,"自己写的...

    使用URL映射地址导航Web页面

    - 错误处理:设置404错误页面,处理未找到的URL。 通过理解和应用这些URL映射技术,开发者能够构建出更加用户友好、搜索引擎友好的Web应用,提高用户体验和网站的可见性。在实际开发中,灵活运用这些原理和技巧,...

    易语言URL网址编解码

    - 查询参数:URL中的查询字符串(即问号后部分)需要编码,以防止特殊字符引起解析错误。 - 链接拼接:在生成动态链接时,需要编码参数以避免特殊字符导致的URL解析问题。 5. **易语言特色**: 易语言提供了丰富...

    url rewrite组件.rar

    6. **URL美化**:使URL更简洁、易读,提高用户友好度。 7. **强制登录**:对于某些特定页面,未登录用户访问时可以重定向到登录页面。 8. **URL参数管理**:可以根据需要添加、删除或修改URL参数。 总的来说,URL...

    UrlRewrite例子

    通过在web.xml中配置UrlRewriteFilter,我们可以定义一系列规则来转换请求的URL,使得原本复杂的动态URL变得简洁易读。 Struts2是一个流行的MVC框架,它的Action机制允许开发者通过不同的URL来调用不同的业务逻辑。...

    Http读文件API.rar

    4. **错误处理**:当请求失败时,API通常会返回一个错误代码,开发者可以根据这个错误代码进行错误处理。 在易语言中,实现Http读文件API的一般步骤如下: 1. **初始化HTTP客户端**:调用相关函数创建HTTP客户端...

    url解码程序,主要针对HTTP

    URL解码是一种处理URL中编码字符的过程,使得原本被编码的数据能够恢复为人类可读的形式。 URL通常由以下几部分组成: 1. 协议:如HTTP、HTTPS、FTP等,定义了数据传输的方式。 2. 主机名:如www.example.com,标识...

    urlrewrite完整示例2.6/3.2/4.0jar包

    - 错误处理:合理设置错误页面,当URL重写失败时,提供友好的错误提示。 - 性能影响:虽然`URLRewrite`提供了很多便利,但过多的重写规则可能会对服务器性能造成一定影响,应适当优化规则。 以上就是关于`URL...

    urlrewrite 4.0.3 jar包.rar

    2. **友好的URL**:使URL更易读,提升用户体验。 3. **隐藏真实路径**:隐藏敏感信息或内部结构,增加安全性。 4. **错误页面重定向**:自动处理404等错误页面,提供统一的错误提示。 5. **会话管理**:在URL中隐式...

    URL中文转换

    否则,不进行编码可能会导致URL解析错误或加载失败。 五、注意事项 1. 要始终明确指定字符编码(如UTF-8),否则可能会出现乱码问题。 2. URL编码不应改变URL的有效部分,如协议(http/https)、域名和路径。 3. ...

    ASP.NET url参数传递加密及解密方法

    8. **解密异常处理**:在解密过程中,可能会遇到无效的数据或密钥错误。此时,应该捕获并处理`CryptographicException`等异常,以确保应用程序的健壮性。 9. **最佳实践**:除了加密,还可以考虑使用HTTPS协议,它...

    js获取url参数

    ### JavaScript 获取 URL 参数详解 #### 一、引言 在Web开发中,通过URL传递参数是一种常见的场景。例如,在用户点击某个链接或者提交表单之后,我们常常需要从URL中提取出特定的信息来完成后续的操作。JavaScript...

    iis url rewrite 2.0

    1. **URL重写**:URL重写允许将不友好的URL转换为更易读、更具描述性的URL,提高用户体验。例如,将动态参数化的URL(如`example.com/?id=123`)重写为静态的URL(如`example.com/article/123`),使页面更容易理解...

    UrlWriter实现url重写的一个实例

    8. **错误处理和调试**:设置不当的重写规则可能导致404错误或其他问题,因此调试和测试是URL重写过程中的重要环节。开发者需要确保所有预期和非预期的URL都能正确重写。 9. **跨平台支持**:虽然这里提到的...

Global site tag (gtag.js) - Google Analytics