您的位置:首页 > 理论基础 > 计算机网络

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();}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: