HTTP请求

package com.fcar.frameworks.net.http;

import com.fcar.frameworks.core.GlobalVar;

import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * Created by carl on 2016/4/25.
 */
public abstract class HttpMethod {
   /**
    * 下载或缓存http请求到的文件的根目录
    */
   public static final String BASE_PATH = GlobalVar.getFcarPath() + "/update";

   protected String url;
   protected Set<HttpHeader> headers;

   public HttpMethod(String httpUrl) {
      this.url = httpUrl;
      this.headers = new HashSet<>();
   }

   public HttpMethod(String httpUrl, String params) {
      this(httpUrl + "?" + params);
   }

   @SuppressWarnings("Duplicates")
   public void addHeader(String header, List<String> value) {
      StringBuilder sb = new StringBuilder();
      Iterator<String> iterator = value.iterator();
      if (!iterator.hasNext()) {
         headers.add(new HttpHeader(header, ""));
         return;
      }

      do {
         sb.append(iterator.next());
         if (!iterator.hasNext())
            break;
         sb.append(' ');
      } while (true);

      headers.add(new HttpHeader(header, sb.toString()));
   }

   public void addHeader(String header, String value) {
      headers.add(new HttpHeader(header, value));
   }

   public void addHeader(HttpHeader httpHeader) {
      headers.add(httpHeader);
   }

   public String getHttpUrl() {
      return url;
   }

   public void setHttpUrl(String httpUrl) {
      this.url = httpUrl;
   }

   public abstract String getMethodName();

   /**
    * 执行Http方法
    */
   public abstract HttpResponse execute() throws IOException;

   /**
    * 获取http版本,注意版本是大小写敏感的
    * @return http版本
    */
   public String getHttpVersion() {
      return "HTTP/1.1";
   }

   public String getRequestLine() {
      return getMethodName() + ' ' +
            url + ' ' +
            getHttpVersion() + "\r\n";
   }

}


package com.fcar.frameworks.net.http;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

/**
 * 该类会将请求内容接收完毕还存在一个文件上以后才返回
 * Created by carl on 2016/4/25.
 */
public class GetMethod extends HttpMethod {

   public GetMethod(String httpUrl) {
      super(httpUrl);
   }

   public GetMethod(String httpUrl, String params) {
      super(httpUrl, params);
   }

   @Override
   public String getMethodName() {
      return "GET";
   }

   @Override
   public HttpResponse execute() throws IOException {
      BufferedInputStream bis = null;
      FileOutputStream fos = null;
      BufferedOutputStream bos = null;
      HttpResponse response = null;
      try {
         URL realUrl = new URL(url);
         // 打开和URL之间的连接
         URLConnection connection = realUrl.openConnection();
         // 设置通用的请求属性
         for (HttpHeader httpHeader : headers) {
            connection.setRequestProperty(httpHeader.getHeaderName(), httpHeader.getHeaderValue());
         }
         // 建立实际的连接
         connection.connect();

         response = new HttpResponse();
         // 获取所有响应头字段
         Map<String, List<String>> map = connection.getHeaderFields();
         for (Map.Entry<String, List<String>> entry : map.entrySet()) {
            response.addHeader(entry.getKey(), entry.getValue());
         }

         System.out.println(connection.getURL());
         byte[] buffer = new byte[4096];

         String fileName = connection.getURL().toString().replace("http://", "");      // url去掉http://
         int index = fileName.indexOf('/');                      // 找到第一个/
         if (index < 0) {
            // 不存在,即页面地址为  http://www.example.com
            // 令文件名为 index.html
            fileName = fileName + '/' + "index.html";
         } else if (index == fileName.length() - 1) {
            // 页面地址为 http://www.example.com/
            // 令文件名为 index.html
            fileName = fileName + "index.html";
         } else {
            fileName = FileNameUtil.normalizeFileName(fileName);
         }
         File cacheFile = new File(BASE_PATH + "/" + fileName);
         response.setContent(cacheFile);
         //noinspection ResultOfMethodCallIgnored
         cacheFile.getParentFile().mkdirs();
         bis = new BufferedInputStream(connection.getInputStream());
         fos = new FileOutputStream(cacheFile);
         bos = new BufferedOutputStream(fos);

         int count;
         // 定义 BufferedReader输入流来读取URL的响应
         while ((count = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, count);
         }
      } finally {
         try {
            if (bos != null)
               bos.close();
            if (fos != null)
               fos.close();
            if (bis != null)
               bis.close();
         } catch (Exception ignore) {
         }
      }
      return response;
   }
}
 
package com.fcar.frameworks.net.http;

/**
 * Created by carl on 2016/4/26.
 */
public class HttpHeader {

   private String headerName;

   private String headerValue;

   public HttpHeader(String headerName, String headerValue) {
      this.headerName = headerName;
      this.headerValue = headerValue;
   }

   public String getHeaderValue() {
      return headerValue;
   }

   public void setHeaderValue(String headerValue) {
      this.headerValue = headerValue;
   }

   public String getHeaderName() {
      return headerName;
   }

   public void setHeaderName(String headerName) {
      this.headerName = headerName;
   }

   public static class ContentTypeHeader extends HttpHeader {
      public ContentTypeHeader(String headerValue) {
         super("Content-Type", headerValue);
      }
   }

   public static class ContentLengthHeader extends HttpHeader {
      public ContentLengthHeader(String headerValue) {
         super("Content-Length", headerValue);
      }
   }

   public static class DateHeader extends HttpHeader {
      public DateHeader(String headerValue) {
         super("Date", headerValue);
      }
   }

   public static class ConnectionHeader extends HttpHeader {
      public ConnectionHeader(String headerValue) {
         super("Connection", headerValue);
      }
   }

   public static class KeepAliveHeader extends HttpHeader {
      public KeepAliveHeader(String headerValue) {
         super("Keep-Alive", headerValue);
      }
   }

   public static class ExpiresHeader extends HttpHeader {
      public ExpiresHeader(String headerValue) {
         super("Expires", headerValue);
      }
   }

   public static class CacheControlHeader extends HttpHeader {
      public CacheControlHeader(String headerValue) {
         super("Cache-Control", headerValue);
      }
   }

   public static class AcceptRangesHeader extends HttpHeader {
      public AcceptRangesHeader(String headerValue) {
         super("Accept-Ranges", headerValue);
      }
   }

   public static class EtagHeader extends HttpHeader {
      public EtagHeader(String headerValue) {
         super("ETag", headerValue);
      }
   }

   public static class LastModifiedHeader extends HttpHeader {
      public LastModifiedHeader(String headerValue) {
         super("Last-Modified", headerValue);
      }
   }

   public static class ServerHeader extends HttpHeader {
      public ServerHeader(String headerValue) {
         super("Server", headerValue);
      }
   }

   public static class UserAgentHeader extends HttpHeader {
      public UserAgentHeader(String headerValue) {
         super("User-Agent", headerValue);
      }
   }

   public static class HostHeader extends HttpHeader {
      public HostHeader(String headerValue) {
         super("Host", headerValue);
      }
   }

   public static class AcceptHeader extends HttpHeader {
      public AcceptHeader(String headerValue) {
         super("Accept", headerValue);
      }
   }

   public static class AcceptLanguageHeader extends HttpHeader {
      public AcceptLanguageHeader(String headerValue) {
         super("Accept-Language", headerValue);
      }
   }

   public static class AcceptEncodingHeader extends HttpHeader {
      public AcceptEncodingHeader(String headerValue) {
         super("Accept-Encoding", headerValue);
      }
   }

   public static class RefererHeader extends HttpHeader {
      public RefererHeader(String headerValue) {
         super("Referer", headerValue);
      }
   }

   public static class IfNoneMatchHeader extends HttpHeader {
      public IfNoneMatchHeader(String headerValue) {
         super("If-None-Match", headerValue);
      }
   }

   public static class IfModifiedSinceHeader extends HttpHeader {
      public IfModifiedSinceHeader(String headerValue) {
         super("If-Modified-Since", headerValue);
      }
   }

   public static class UpgradeInsecureRequestsHeader extends HttpHeader {
      public UpgradeInsecureRequestsHeader(String headerValue) {
         super("Upgrade-Insecure-Requests", headerValue);
      }
   }

   public static class CookieHeader extends HttpHeader {
      public CookieHeader(String headerValue) {
         super("Cookie", headerValue);
      }
   }
}

package com.fcar.frameworks.net.http;

import java.io.File;
import java.util.*;

/**
 * Created by carl on 2016/4/25.
 */
public class HttpResponse {
   /**
    * 状态行
    */
   private String status;

   /**
    * 消息头
    */
   private Set<HttpHeader> headers;

   /**
    * Http正文
    */
   private File content;

   public HttpResponse() {
      status = "";
      content = null;
      headers = new HashSet<>();
   }

   public String getStatus() {
      return status;
   }

   public void setStatus(String status) {
      this.status = status;
   }

   public Set<HttpHeader> getHeaders() {
      return headers;
   }

   public void setHeaders(Set<HttpHeader> headers) {
      this.headers = headers;
   }

   public File getContent() {
      return content;
   }

   public void setContent(File content) {
      this.content = content;
   }

   public void addHeader(String header, String value) {
      headers.add(new HttpHeader(header, value));
   }

   public void addHeader(HttpHeader httpHeader) {
      headers.add(httpHeader);
   }

   @SuppressWarnings("Duplicates")
   public void addHeader(String header, List<String> value) {
      StringBuilder sb = new StringBuilder();
      Iterator<String> iterator = value.iterator();
      if (!iterator.hasNext()) {
         headers.add(new HttpHeader(header, ""));
         return;
      }

      do {
         sb.append(iterator.next());
         if (!iterator.hasNext())
            break;
         sb.append(' ');
      } while (true);

      headers.add(new HttpHeader(header, sb.toString()));
   }
}
package com.fcar.frameworks.net.http;

/**
 * Created by carl on 2016/4/26.
 */
public class FileNameUtil {
   /**
    * 文件名中有九个字符不能出现:  /\:"?><|*,<br/>
    * 该方法是将这些字符转换为其它字符的方法。<br/>
    * 考虑到@符号使用比较少,因此该方法使用@作为转义符,对应关系如下:<br/>
    * <table boarder="1">
    *     <tr><th>原始字符</th><th>转义符</th></tr>
    *     <!--tr><td align="center">/</td><td align="center">@s</td></tr-->
    *     <!--tr><td align="center">\</td><td align="center">@b</td></tr-->
    *     <tr><td align="center">:</td><td align="center">@c</td></tr>
    *     <tr><td align="center">"</td><td align="center">@q</td></tr>
    *     <tr><td align="center">?</td><td align="center">@a</td></tr>
    *     <tr><td align="center">></td><td align="center">@g</td></tr>
    *     <tr><td align="center"><</td><td align="center">@l</td></tr>
    *     <tr><td align="center">|</td><td align="center">@v</td></tr>
    *     <tr><td align="center">*</td><td align="center">@w</td></tr>
    *     <tr><td align="center">@</td><td align="center">@@</td></tr>
    *     <tr><td align="center">其它符号</td><td align="center">@其它符号 或者 不转义</td></tr>
    * </table>
    * @param string
    * @return
    */
   public static String normalizeFileName(String string) {
      StringBuilder sb = new StringBuilder();
      int len = string.length();

      for (int i = 0; i < len; ++i) {
         switch (string.charAt(i)) {
//          case '/':
//             sb.append("@s");
//             break;
//          case '\\':
//             sb.append("@b");
//             break;
            case '*':
               sb.append("@w");
               break;
            case '"':
               sb.append("@q");
               break;
            case '?':
               sb.append("@a");
               break;
            case ':':
               sb.append("@c");
               break;
            case '<':
               sb.append("@l");
               break;
            case '>':
               sb.append("@g");
               break;
            case '|':
               sb.append("@v");
               break;
            case '@':
               sb.append("@@");
               break;
            default:
               sb.append(string.charAt(i));
         }
      }
      return sb.toString();
   }
   
   public static String orignalString(String fileName) {
      StringBuilder sb = new StringBuilder();
      int len = fileName.length();

      for (int i = 0; i < len; ++i) {
         char ch = fileName.charAt(i);
         if (ch == '@') {
            i++;
            char ch2 = fileName.charAt(i);
            switch (ch2) {
//             case 's':
//                sb.append('/');
//                break;
//             case 'b':
//                sb.append('\\');
//                break;
               case 'w':
                  sb.append('*');
                  break;
               case 'q':
                  sb.append('"');
                  break;
               case 'a':
                  sb.append('?');
                  break;
               case 'c':
                  sb.append(':');
                  break;
               case 'l':
                  sb.append('<');
                  break;
               case 'g':
                  sb.append('>');
                  break;
               case 'v':
                  sb.append('|');
                  break;
               case '@':
                  sb.append('@');
                  break;
               default:
                  sb.append(ch2);
            }
         } else {
            sb.append(ch);
         }
      }
      return sb.toString();
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值