首页 > 其他分享 >httpclient

httpclient

时间:2023-09-19 14:32:45浏览次数:35  
标签:url System httpconn setRequestProperty println path httpclient


         昨天在写完java下载的文章后就在今天发现了一个问题。通过这个问题也反应出对HttpURLConnection这个类还不了解。趁此机会再添加一些对这个类的了解吧。首先看看前面那断代码在我的程序中出现了什么问题:

         在我的程序中有这么一个模块,通过给定的url下载到文件,保存到本地。而文件是binary形式的。例如:http://abc/li.exe,

          用下面代码会出现一个问题,就是当这个url被重定向到一个网页时,下载下来的就是网页的内容:

public static  File saveToFiles(String destUrl,String path) throws IOException {
             final int BUFFER_SIZE = 4096;
             System.out.println("file download url is "+destUrl+" path is"+path+"--------------");
             FileOutputStream fos = null;
             BufferedInputStream bis = null;
             HttpURLConnection httpconn = null;
             URL url = null;
             byte[] buf = new byte[BUFFER_SIZE];
             int size = 0;
             if(rc.isUseProxy()){   // 此处为读取配置文件的内容,确定是否使用代理
                 Properties   prop   =   System.getProperties();  
                    //set http  proxy addr
                  prop.setProperty("http.proxyHost",   rc.getHttpProxyHost());      //设置代理的Ip
                   // set http  proxy port
                  prop.setProperty("http.proxyPort",   rc.getHttpProxyPort()+"");   //设置代理的端口
             }    
             File storeFile = new File(path,System.currentTimeMillis()+".tmp");
             System.out.println("file download url is "+destUrl+"path is "+path+"---------------");             // connection
             url = new URL(destUrl);
             httpconn = (HttpURLConnection) url.openConnection();
             httpconn.setRequestProperty("Host", "analigesto.com");
             httpconn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.18) Gecko/2010021501 Ubuntu/9.04 (jaunty) Firefox/3.0.18");
             httpconn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
             httpconn.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.5");
             httpconn.setRequestProperty("Accept-Encoding", "gzip,deflate");
             httpconn.setRequestProperty("Accept-Charset", "gb2312,utf-8;q=0.7,*;q=0.7");
             httpconn.setRequestProperty("Keep-Alive", "300");
             httpconn.setRequestProperty("Connection", "Keep-Alive");
             //httpconn.setRequestProperty("Referer", url);    
             httpconn.setRequestProperty("Cookie", "PHPSESSID=1d888d20bba26e676811ebf7f0cd109b");
             try{
                 httpconn.setReadTimeout(40000); // 设置读取文件超时时间
                 httpconn.connect();
                 int statuscode = httpconn.getResponseCode(); // 建立链接后先查询url的状态码
                 if(statuscode == 200){ //链接正常。并得到了返回信息
                     bis = new BufferedInputStream(httpconn.getInputStream()); // 建立管道,准备读取数据流
                     fos = new FileOutputStream(storeFile);
                     System.out.println("it is to receive link[" + destUrl + "]content/n be save file is:[" + storeFile
                             + "]");
                     
                     while ((size = bis.read(buf)) != -1){ // 保存文件到本地磁盘
                         fos.write(buf, 0, size);
                     }
                     System.out.println("file download url is "+destUrl+"  path is"+path+"  "+new Date());
                     fos.close();
                     bis.close();
                     httpconn.disconnect();
                     System.out.println("saveToFiles file is "+storeFile.getName()+" size is "+storeFile.length());
                 }else{
                     return null;
                 }
             }catch(Exception e){
                 System.out.println(destUrl+" this url connection timeout ");
                 System.out.println(e.toString());
                 return null;
             }
             return storeFile;
         }

     为了防止下载文件出现这种问题,我们需要在httpconn.connect();完成连接后判断连接到的文件的属性。在此加上一句话

String type = httpconn.getContentType();
                     if(statuscode == 200 && type.contains("application/")){                            //此处与上面相同。
                      }

   这样下载下来的文件就是应用程序而非网页了。当有一个binary文件url被重定向后就可以避免把网页文件当成自己想要下载的内容去下载了----

标签:url,System,httpconn,setRequestProperty,println,path,httpclient
From: https://blog.51cto.com/u_1481758/7525099

相关文章

  • HttpClient MultipartFormDataContent
    varfileStream=newMemoryStream(fileContent);varparametersList=newMultipartFormDataContent{{newStringContent(folderName),"FolderName"},{newStringContent(fileNam......
  • HttpClient采集页面数据
    1、导入相关依赖<!--https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client--><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.0</version&......
  • 如何使用 jest 测试使用 axios 的 httpClient?
    要使用Jest测试使用axios的httpClient,您可以使用Jest提供的模拟功能来伪造对外部API的请求和响应。下面是一个示例测试的代码:首先,安装所需的依赖:npminstallaxiosaxios-mock-adapterjest--save-dev然后,创建一个名为httpService.test.js的测试文件,编写以下代码:importaxiosfrom......
  • HttpClient在SpringBoot中的使用
    一、简介HttpClient是ApacheJakartaCommon下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。HttpClient是一个HTTP通信库、一个工具包,它只提供一个通用浏览器应用程序所期望的功能子集,与浏览器相比是没有界面的。二、引入依赖<!--httpcli......
  • angular - HttpClient
    入门引入HttpClientModule模块//app.module.tsimport{HttpClientModule}from'@angular/common/http';@NgModule({imports:[HttpClientModule],})注入服务实例import{HttpClient}from'@angular/common/http';exportclassAppC......
  • C# 关于HttpClient的使用
    当我们在C#中调用RestApi通常有三种方式HttpWebRequest是一种相对底层的处理Httprequest/response的方式已过时WebClient提供了对HttpWebRequest的高层封装,来简化使用者的调用已过时HttpClient是一种新的处理Httprequest/response工具包,具有更高的......
  • 吉特日化MES & HttpClient基础连接已经关闭: 连接被意外关闭
    在吉特日化MES调用某公司AGV平台下发任务的时候,使用HttpClient进行POST请求,出现如下异常: HttpClient基础连接已经关闭:连接被意外关闭 ,之前已经使用HTTPClient做过大量的三方请求均为发现此问题publicstringExecute(stringApiName,JObjectparameters)......
  • C# .NET 使用HttpClient,以及自定义Header中存在特殊字符的处理方式
    平常我们在使用HttpClient时,只需要创建加上设置调用接口地址就可以使用了,比如:HttpClienthttpClient=httpClientFactory.CreateClient();httpClient.BaseAddress=newUri(接口地址);httpClient.PostAsync(接口方法,HttpContent);但是,在自定义Header......
  • 再也不用写请求HttpHelper了,HttpClient帮助你
    前言在C#7.1之后,net推出HttpClient类代替WebRequest,HttpWebRequest,ServicePoint,andWebClient,先来看下他们在以前的作用HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的一种方式ServicePoint提供HTTP连接的连接管理WebClient提供用于将数据发送到由......
  • HttpClient Https请求 基础连接已经关闭,发送时发生错误
    可能有以下几个原因:证书问题:服务端证书无效或者客户端不信任服务器证书会导致握手失败。你需要检查服务端证书是否有效,是否由受信任的证书颁发机构(CA)签署。TLS版本不兼容:服务端只支持较新版本的TLS,而客户端使用的.NET版本较旧,其中包含的TLS版本与服务端不兼容。尝试升级.......