HTTP请求
2016-06-22 16:13
459 查看
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);}@Overridepublic String getMethodName() {return "GET";}@Overridepublic 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.htmlfileName = fileName + '/' + "index.html";} else if (index == fileName.length() - 1) {// 页面地址为 http://www.example.com/ // 令文件名为 index.htmlfileName = fileName + "index.html";} else {fileName = FileNameUtil.normalizeFileName(fileName);}File cacheFile = new File(BASE_PATH + "/" + fileName);response.setContent(cacheFile);//noinspection ResultOfMethodCallIgnoredcacheFile.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();}}
相关文章推荐
- TCP三次握手 与 四次断开 的详细过程剖析
- 计算机网络——超文本传送协议HTTP
- 网络霸凌、收费阅读和内容创业
- Fiddler模拟低俗网络环境
- XmLHttpRequst下载文件
- http协议响应状态码大全以及常用状态码
- 正向代理
- 利用cpdetector获取文件编码格式,同时得到网页内容。增加http/https通用方式
- HttpURLConnection介绍
- C# Http POST请求方法
- volley使用
- 【网络安全】SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
- Java 十进制和十六制之间的转化(负数的处理)___http://www.cnblogs.com/literoad/archive/2013/01/25/2875908.html
- 卷积神经网络反向传播算法
- 理解 Linux 网络栈(1):Linux 网络协议栈简单总结 图
- centos6.5 使用setup配置网络
- web.xml 中的listener、 filter、servlet 加载顺序及其详解___http://www.cnblogs.com/JesseV/archive/2009/11/17/16050
- OkHttpUtils一个专注于让网络请求更简单的框架
- tcp-backlog配置
- ping(8)命令