Request、Response 之 Http 请求
今天说些什么呢?
说说Request吧!
Request是什么:
请求(Request):一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
request这个对象不用事先宣告,就可以在JSP网页中使用,在转译为Servlet之后,它会转换为javax.servlet.http.HttpServletRequest型态的对象,HttpServletRequest对象是有关于客户端所发出的请求之对象,只要是有关于客户端请求的信息,都可以藉由它来取得,例如请求标头、请求方法、请求参数、使用者IP等等信息。
标准的请求头:
Accept:浏览器(或者其他基于HTTP的客户端程序)可以接收的内容类型(Content-types),例如 Accept: text/plain
Accept-Charset:浏览器能识别的字符集,例如 Accept-Charset: utf-8
Accept-Encoding:浏览器可以处理的编码方式,注意这里的编码方式有别于字符集,这里的编码方式通常指gzip,deflate等。例如 Accept-Encoding: gzip, deflate
Accept-Language:浏览器接收的语言,其实也就是用户在什么语言地区,例如简体中文的就是 Accept-Language: zh-CN
Authorization:在HTTP中,服务器可以对一些资源进行认证保护,如果你要访问这些资源,就要提供用户名和密码,这个用户名和密码就是在Authorization头中附带的,格式是“username:password”字符串的base64编码,例如:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==中,basic指使用basic认证方式, QWxhZGRpbjpvcGVuIHNlc2FtZQ==使用base64解码就是“Aladdin:open sesame”
Cache-Control:这个指令在request和response中都有,用来指示缓存系统(服务器上的,或者浏览器上的)应该怎样处理缓存,因为这个头域比较重要,特别是希望使用缓 存改善性能的时候,内容也较多,所以我想在下一篇博文中主要介绍一下。
Connection:告诉服务器这个user agent(通常就是浏览器)想要使用怎样的连接方式。值有keep-alive和close。http1.1默认是keep-alive。keep-alive就是浏览器和服务器 的通信连接会被持续保存,不会马上关闭,而close就会在response后马上关闭。但这里要注意一点,我们说HTTP是无状态的,跟这个是否keep-alive没有关系,不要认为keep-alive是对HTTP无状态的特性的改进。
Cookie:浏览器向服务器发送请求时发送cookie,或者服务器向浏览器附加cookie,就是将cookie附近在这里的。例如:Cookie:user=admin
Content-Length:一个请求的请求体的内存长度,单位为字节(byte)。请求体是指在HTTP头结束后,两个CR-LF字符组之后的内容,常见的有POST提交的表单数据,这个Content-Length并不包含请求行和HTTP头的数据长度。
Content-MD5:使用base64进行了编码的请求体的MD5校验和。例如:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Type:请求体中的内容的mime类型。通常只会用在POST和PUT方法的请求中。例如:Content-Type: application/x-www-form-urlencoded
Date:发送请求时的GMT时间。例如:Date: Tue, 15 Nov 1994 08:12:31 GMT
From:发送这个请求的用户的email地址。例如:From: user@example.com
Host:被服务器的域名或IP地址,如果不是通用端口,还包含该端口号,例如:Host: www.some.com:182
If-Match:通常用在使用PUT方法对服务器资源进行更新的请求中,意思就是,询问服务器,现在正在请求的资源的tag和这个If-Match的tag相不相同,如果相同,则证明服务器上的这个资源还是旧的,现在可以被更新,如果不相同,则证明该资源被更新过,现在就不用再更新了(否则有可能覆盖掉其他人所做的更改)。
If-Modified-Since:询问服务器现在正在请求的资源在某个时间以来有没有被修改过,如果没有,服务器则返回304状态来告诉浏览器使用浏览器自己本地的缓存,如果有修改过,则返回200,并发送新的资源(当然如果资源不存在,则返回404。)
If-None-Match:和If-Modified-Since用意差不多,不过不是根据时间来确定,而是根据一个叫ETag的东西来确定。
If-Range:告诉服务器如果这个资源没有更改过(根据If-Range后面给出的Etag判断),就发送这个资源中在浏览器缺少了的某些部分给浏览器,如果该资源以及被修改过,则将整个资源重新发送一份给浏览器。
If-Unmodified-Since:询问服务器现在正在请求的资源在某个时刻以来是否没有被修改过。
Max-Forwards:限制请求信息在代理服务器或网关中向前传递的次数。
Pragma:好像只有一个值,就是:no-cache。Pragma:no-cache 与cache-control:no-cache相同,只不过cache-control:no-cache是http1.1专门指定的,而Pragma:no-cache可以在http1.0和1.1中使用
Proxy-Authorization:连接到某个代理时使用的身份认证信息,跟Authorization头差不多。例如:Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range:在HTTP头中,"Range"字眼都表示“资源的byte形式数据的顺序排列,并且取其某一段数据”的意思。Range头就是表示请求资源的从某个数值到某个数值间的数据,例如:Range: bytes=500-999 就是表示请求资源从500到999byte的数据。数据的分段下载和多线程下载就是利用这个实现的。
Referer:指当前请求的URL是在什么地址引用的。例如在www.xxx.com/index.html页面中点击一个指向www.yyy.com的超链接,那么,这个www.yyy.com的请求中的Referer就是www.xxx.com/index.html。通常我们见到的图片防盗链就是用这个实现的。
Upgrade:请求服务器更新至另外一个协议,例如:Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent:通常就是用户的浏览器相关信息。例如:User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0
Via:用来记录一个请求经过了哪些代理或网关才被送到目标服务器上。例如一个请求从浏览器出发(假设使用http/1.0),发送给名为 SomeProxy的内部代理,然后被转发至www.somenet.com的公共代理(使用http/1.1),最后被转发至目标服务器www.someweb.com,那么在someweb.com中收到的via 头应该是:via:1.0 someProxy 1.1 www.someweb.com(apache 1.1)
Warning:记录一些警告信息。
通用但非标准的HTTP头(通常,非标准的头域都是用“X-”开头,例如"x-powered-by"):
X-Requested-With:主要是用来识别ajax请求,很多javascript框架会发送这个头域(值为XMLHttpRequest)
DNT:DO NOT TRACK的缩写,要求服务器程序不要跟踪记录用户信息。DNT: 1 (开启DNT) DNT: 0 (关闭DNT)火狐,safari,IE9都支持这个头域,并且于2011年3月7日被提交至IETF组织实现标准化
X-Forwarded-For:记录一个请求从客户端出发到目标服务器过程中经历的代理,或者负载平衡设备的IP。
X-Forwarded-Proto:记录一个请求一个请求最初从浏览器发出时候,是使用什么协议。因为有可能当一个请求最初和反向代理通信时,是使用https,但反向代理和服务器通信时改变成http协议,这个时候,X-Forwarded-Proto的值应该是https
Front-End-Https:微软使用与其负载平衡的一个头域。
X-ATT-DeviceId:AT&A的产品中使用的头域,不过不是很清楚用途。
Java 的 Http 请求调用方法总结:
UrlConnection:
- <span style="font-size: 12px; font-family: SimSun, 宋体, tahoma, arial, helvetica, sans-serif;">import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.URL;
- /**
- * Http Request Test
- *
- * @author ljw
- *
- */
- public class HttpTest {
- public static void main(String args[]) throws IOException {
- URL url = new URL("http://www.zuoche.com");
- // 请求配置,可根据实际情况采用灵活配置
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- connection.setReadTimeout(1000 * 10);
- connection.setConnectTimeout(1000 * 10);
- // 请求的方法 Get or Post
- connection.setRequestMethod("GET");
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setUseCaches(false);
- // 相关请求头
- connection.setRequestProperty("Charsert", "UTF-8");
- connection.setRequestProperty("Content-Type", "text/plain");
- // 写入请求实体
- StringBuilder params = new StringBuilder();
- // json 格式的键值对
- params.append("{");
- params.append("\"key\"").append(":\"").append("value");
- // "\"key\"" \标识强转"号,因为参数传递时需要使用""
- params.append("\"}");
- connection.getOutputStream().write(params.toString().getBytes());
- connection.getOutputStream().flush();
- connection.getOutputStream().close();
- // 进去连接
- connection.connect();
- // 响应
- try {
- InputStream in = connection.getInputStream();
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
- StringBuffer temp = new StringBuffer();
- String line = bufferedReader.readLine();
- while (line != null) {
- temp.append(line);
- line = bufferedReader.readLine();
- }
- bufferedReader.close();
- System.out.println(temp);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (connection != null)
- connection.disconnect();
- }
- }
- }
- </span>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL; /**
- Http Request Test
- @author ljw
public class HttpTest {
public static void main(String args[]) throws IOException {
URL url = new URL("http://www.zuoche.com");
// 请求配置,可根据实际情况采用灵活配置
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(1000 * 10);
connection.setConnectTimeout(1000 * 10);
// 请求的方法 Get or Post
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
// 相关请求头
connection.setRequestProperty("Charsert", "UTF-8");
connection.setRequestProperty("Content-Type", "text/plain");
// 写入请求实体
StringBuilder params = new StringBuilder();
// json 格式的键值对
params.append("{");
params.append("\"key\"").append(":\"").append("value");
// "\"key\"" \标识强转"号,因为参数传递时需要使用""
params.append("\"}");
connection.getOutputStream().write(params.toString().getBytes());
connection.getOutputStream().flush();
connection.getOutputStream().close();
// 进去连接
connection.connect();
// 响应
try {
InputStream in = connection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
StringBuffer temp = new StringBuffer();
String line = bufferedReader.readLine();
while (line != null) {
temp.append(line);
line = bufferedReader.readLine();
}
bufferedReader.close();
System.out.println(temp);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null)
connection.disconnect();
}
}
}
HttpClient:
- <span style="font-size: 14px; font-family: SimSun, 宋体, tahoma, arial, helvetica, sans-serif;">import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.TimeUnit;
- import org.apache.http.HttpResponse;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.ClientProtocolException;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.conn.ClientConnectionManager;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.params.BasicHttpParams;
- import org.apache.http.params.HttpConnectionParams;
- import org.apache.http.params.HttpParams;
- import org.apache.http.protocol.HTTP;
- import org.apache.http.util.EntityUtils;
- /**
- * Http Request Test
- *
- * @author ljw
- *
- */
- public class HttpTest {
- public static void main(String args[]) {
- HttpTest test = new HttpTest();
- test.clientconnection("http://www.zuoche.com");
- }
- public String clientconnection(String url) {
- HttpClient client = getClient();
- // Get方式
- HttpGet get = new HttpGet(url);
- try {
- HttpResponse response = client.execute(get);
- String result = EntityUtils.toString(response.getEntity());
- System.out.println(result);
- return result;
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // Post方式
- HttpPost post = new HttpPost("http://www.zuoche.com");
- try {
- /* 添加请求参数到请求对象*/
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- params.add(new BasicNameValuePair("key", "value"));
- post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
- HttpResponse response = client.execute(post);
- String result = EntityUtils.toString(response.getEntity());
- System.out.println(result);
- return result;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- static ClientConnectionManager _ClientConnectionManager = new ThreadSafeClientConnManager();
- static HttpParams _HttpParams;
- static {
- _HttpParams = new BasicHttpParams();
- HttpConnectionParams.setConnectionTimeout(_HttpParams, 10 * 1000);
- HttpConnectionParams.setSoTimeout(_HttpParams, 10 * 1000);
- _ClientConnectionManager = new ThreadSafeClientConnManager();
- }
- public HttpClient getClient() {
- _ClientConnectionManager.closeExpiredConnections();
- _ClientConnectionManager.closeIdleConnections(1, TimeUnit.HOURS);
- return new DefaultHttpClient(_ClientConnectionManager, _HttpParams);
- }
- }</span>
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils; /**
- Http Request Test
- @author ljw
public class HttpTest {
public static void main(String args[]) {
HttpTest test = new HttpTest();
test.clientconnection("http://www.zuoche.com");
}
public String clientconnection(String url) {
HttpClient client = getClient();
// Get方式
HttpGet get = new HttpGet(url);
try {
HttpResponse response = client.execute(get);
String result = EntityUtils.toString(response.getEntity());
System.out.println(result);
return result;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// Post方式
HttpPost post = new HttpPost("http://www.zuoche.com");
try {
/* 添加请求参数到请求对象*/
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key", "value"));
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse response = client.execute(post);
String result = EntityUtils.toString(response.getEntity());
System.out.println(result);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
static ClientConnectionManager _ClientConnectionManager = new ThreadSafeClientConnManager();
static HttpParams _HttpParams;
static {
_HttpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(_HttpParams, 10 * 1000);
HttpConnectionParams.setSoTimeout(_HttpParams, 10 * 1000);
_ClientConnectionManager = new ThreadSafeClientConnManager();
}
public HttpClient getClient() {
_ClientConnectionManager.closeExpiredConnections();
_ClientConnectionManager.closeIdleConnections(1, TimeUnit.HOURS);
return new DefaultHttpClient(_ClientConnectionManager, _HttpParams);
}
}
相关依赖的jar包见附件: httpclient-4.1.3.jar ; httpcore-4.1.4.jar
Request、Response 之 Http 请求的更多相关文章
- javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别
先来两张图,方便理解: 可以看出,重定向时,是服务器向游览器重新发送了一个response命令,让游览器再次向url2发送请求,以获取url2的资源 而请求转发时,类似于是服务器自己向自己发了一个跳转 ...
- tomcat启动(Ⅷ)--请求最终目的地 getContainer().getPipeline().getFirst().invoke(request, response)
当tomcat的Conector保存着StandardService实例,而StandardService保存着Container的实例 当Http11NioProcessor.process()方法 ...
- 【JavaWeb】请求和响应Request&Response
请求 请求对象 关于请求 顾名思义,意思就是请求一个"对象" 请求不到的,别想了 请求,就是使用者希望从服务器端索取一些资源,向服务器发出询问.在B/S架构中,就是客户浏览器向服务 ...
- request response
request 和 response 这两个对象是出现在service方法中.service方法是用来接收请求处理请求,完成响应的. 接受请求指的就是request对象 完成响应指的就 ...
- request \response 总结
request&response request 1.获得信息的方法 1> 获得请求首行信息的方法 *getMethod *getContextP ...
- 09 Request/Response
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 request和response对象即然代表 ...
- 过滤器中的chain.doFilter(request,response)
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...
- 对chain.doFilter(request,response)的理解
他的作用是将请求转发给过滤器链上下一个对象.这里的“下”指的是哪里 ? 指的是下一个filter,如果没有filter那就是你请求的资源. 一般filter都是一个链,web.xml 里面配置了几个就 ...
- chain.doFilter(request,response)含义
过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...
随机推荐
- window.location.href和window.top.location.href的区别
if (window.location.href == window.top.location.href) { window.top.location.href = "/index. ...
- 51nod 更难的矩阵取数问题 + 滚动数组优化
这里要求要走到终点再走回来,可以转化为两个人走. 那么我们可以先粗暴的设f[x1][y1][x2][y2]为第一个人走到(x1, y1), 第二个人走到(x2, y2)的最大价值. 那么这样空间会很大 ...
- 紫书 例题 9-14 UVa 1218 (树形dp)
这道题有个初始值设成1e9, 然后这个值是要加很多次的,然后就会溢出变成负数, 然后就一直WA, 找这个bug找了一个小时--以后不能随便这样设那么大, 要考虑会不会加很多次然后溢出. 讲一下思路. ...
- 洛谷——P1518 两只塔姆沃斯牛 The Tamworth Two
https://www.luogu.org/problem/show?pid=1518 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为( ...
- sparkR处理Gb级数据集
spark集群搭建及介绍:敬请关注 数据集:http://pan.baidu.com/s/1sjYN7lF 总结:使用sparkR进行数据分析建模相比R大致有3-5倍的提升 查看原始数据集:通过iri ...
- 你如何理解 HTML5 的 section?会在什么场景使用?为什么这些场景使用 section 而不是 div?
section元素表示文档或应用的一个部分.所谓“部分”,这里是指按照主题分组的内容区域,通常会带有标题.[也就是每个section对应不同的主题.注意是内容本身的主题,而不是其他人为设定的划分标准. ...
- 79.QT解决迷宫问题(面向过程与面向对象)
面向过程: 创建一个类继承dialog,mydialog,添加两个变量 #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog>&g ...
- 兼容MIUI5和MIUI6的开启悬浮窗设置界面
前一段时间项目中需要对MIUI的悬浮窗开启设置界面进行了引导和跳转,MIUI6中又改变了开启悬浮窗设置的位置,在苦苦寻觅之后,找到了解决的方法,贴出来以方便大家参考和使用. @Override pub ...
- webclient类学习
(HttpWebRequest模拟请求登录):当一些硬件设备接口 或需要调用其他地方的接口时,模拟请求登录获取接口的数据就很有必要. webclient类:只想从特定的URI请求文件,则使用WebCl ...
- 【JEECG技术博文】JEECG 简单实例解说权限控制
JEECG简单实例解说权限控制 请大家点击这里为我们投票.2015博客之星.很多其他分享敬请期待 博文地址:http://blog.itpub.net/30066956/viewspace-18687 ...