今天说些什么呢?

说说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:

  1. <span style="font-size: 12px; font-family: SimSun, 宋体, tahoma, arial, helvetica, sans-serif;">import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.net.HttpURLConnection;
  6. import java.net.URL;
  7. /**
  8. * Http Request Test
  9. *
  10. * @author ljw
  11. *
  12. */
  13. public class HttpTest {
  14. public static void main(String args[]) throws IOException {
  15. URL url = new URL("http://www.zuoche.com");
  16. // 请求配置,可根据实际情况采用灵活配置
  17. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  18. connection.setReadTimeout(1000 * 10);
  19. connection.setConnectTimeout(1000 * 10);
  20. // 请求的方法 Get or Post
  21. connection.setRequestMethod("GET");
  22. connection.setDoOutput(true);
  23. connection.setDoInput(true);
  24. connection.setUseCaches(false);
  25. // 相关请求头
  26. connection.setRequestProperty("Charsert", "UTF-8");
  27. connection.setRequestProperty("Content-Type", "text/plain");
  28. // 写入请求实体
  29. StringBuilder params = new StringBuilder();
  30. // json 格式的键值对
  31. params.append("{");
  32. params.append("\"key\"").append(":\"").append("value");
  33. // "\"key\"" \标识强转"号,因为参数传递时需要使用""
  34. params.append("\"}");
  35. connection.getOutputStream().write(params.toString().getBytes());
  36. connection.getOutputStream().flush();
  37. connection.getOutputStream().close();
  38. // 进去连接
  39. connection.connect();
  40. // 响应
  41. try {
  42. InputStream in = connection.getInputStream();
  43. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
  44. StringBuffer temp = new StringBuffer();
  45. String line = bufferedReader.readLine();
  46. while (line != null) {
  47. temp.append(line);
  48. line = bufferedReader.readLine();
  49. }
  50. bufferedReader.close();
  51. System.out.println(temp);
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. } finally {
  55. if (connection != null)
  56. connection.disconnect();
  57. }
  58. }
  59. }
  60. </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:

  1. <span style="font-size: 14px; font-family: SimSun, 宋体, tahoma, arial, helvetica, sans-serif;">import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.TimeUnit;
  5. import org.apache.http.HttpResponse;
  6. import org.apache.http.NameValuePair;
  7. import org.apache.http.client.ClientProtocolException;
  8. import org.apache.http.client.HttpClient;
  9. import org.apache.http.client.entity.UrlEncodedFormEntity;
  10. import org.apache.http.client.methods.HttpGet;
  11. import org.apache.http.client.methods.HttpPost;
  12. import org.apache.http.conn.ClientConnectionManager;
  13. import org.apache.http.impl.client.DefaultHttpClient;
  14. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
  15. import org.apache.http.message.BasicNameValuePair;
  16. import org.apache.http.params.BasicHttpParams;
  17. import org.apache.http.params.HttpConnectionParams;
  18. import org.apache.http.params.HttpParams;
  19. import org.apache.http.protocol.HTTP;
  20. import org.apache.http.util.EntityUtils;
  21. /**
  22. * Http Request Test
  23. *
  24. * @author ljw
  25. *
  26. */
  27. public class HttpTest {
  28. public static void main(String args[]) {
  29. HttpTest test = new HttpTest();
  30. test.clientconnection("http://www.zuoche.com");
  31. }
  32. public String clientconnection(String url) {
  33. HttpClient client = getClient();
  34. // Get方式
  35. HttpGet get = new HttpGet(url);
  36. try {
  37. HttpResponse response = client.execute(get);
  38. String result = EntityUtils.toString(response.getEntity());
  39. System.out.println(result);
  40. return result;
  41. } catch (ClientProtocolException e) {
  42. e.printStackTrace();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. // Post方式
  47. HttpPost post = new HttpPost("http://www.zuoche.com");
  48. try {
  49. /* 添加请求参数到请求对象*/
  50. List<NameValuePair> params = new ArrayList<NameValuePair>();
  51. params.add(new BasicNameValuePair("key", "value"));
  52. post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
  53. HttpResponse response = client.execute(post);
  54. String result = EntityUtils.toString(response.getEntity());
  55. System.out.println(result);
  56. return result;
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. }
  60. return null;
  61. }
  62. static ClientConnectionManager _ClientConnectionManager = new ThreadSafeClientConnManager();
  63. static HttpParams _HttpParams;
  64. static {
  65. _HttpParams = new BasicHttpParams();
  66. HttpConnectionParams.setConnectionTimeout(_HttpParams, 10 * 1000);
  67. HttpConnectionParams.setSoTimeout(_HttpParams, 10 * 1000);
  68. _ClientConnectionManager = new ThreadSafeClientConnManager();
  69. }
  70. public HttpClient getClient() {
  71. _ClientConnectionManager.closeExpiredConnections();
  72. _ClientConnectionManager.closeIdleConnections(1, TimeUnit.HOURS);
  73. return new DefaultHttpClient(_ClientConnectionManager, _HttpParams);
  74. }
  75. }</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&lt;NameValuePair&gt; params = new ArrayList&lt;NameValuePair&gt;();
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 请求的更多相关文章

  1. javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别

    先来两张图,方便理解: 可以看出,重定向时,是服务器向游览器重新发送了一个response命令,让游览器再次向url2发送请求,以获取url2的资源 而请求转发时,类似于是服务器自己向自己发了一个跳转 ...

  2. tomcat启动(Ⅷ)--请求最终目的地 getContainer().getPipeline().getFirst().invoke(request, response)

    当tomcat的Conector保存着StandardService实例,而StandardService保存着Container的实例 当Http11NioProcessor.process()方法 ...

  3. 【JavaWeb】请求和响应Request&Response

    请求 请求对象 关于请求 顾名思义,意思就是请求一个"对象" 请求不到的,别想了 请求,就是使用者希望从服务器端索取一些资源,向服务器发出询问.在B/S架构中,就是客户浏览器向服务 ...

  4. request response

    request 和 response 这两个对象是出现在service方法中.service方法是用来接收请求处理请求,完成响应的.     接受请求指的就是request对象     完成响应指的就 ...

  5. request \response 总结

    request&response request 1.获得信息的方法     1> 获得请求首行信息的方法         *getMethod         *getContextP ...

  6. 09 Request/Response

         Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象      request和response对象即然代表 ...

  7. 过滤器中的chain.doFilter(request,response)

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...

  8. 对chain.doFilter(request,response)的理解

    他的作用是将请求转发给过滤器链上下一个对象.这里的“下”指的是哪里 ? 指的是下一个filter,如果没有filter那就是你请求的资源. 一般filter都是一个链,web.xml 里面配置了几个就 ...

  9. chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...

随机推荐

  1. 如何建立远程桌面连接(XP、Vista、Win7)

    如何建立远程桌面连接(XP.Vista.Win7) 要求: 1:对方即你要连的机器必须要允许远程桌面连接,操作系统一般是winXP(单用户)和win2003server(多用户),具体设置:右击我的电 ...

  2. java8新增特性(一)---Lambda表达式

    Lambda表达式也成为闭包,是java语言层次上的改变,Lambda同意把函数作为一个方法的參数(函数作为參数传递进方法中),或者把代码看成数据.函数式程序猿对这一概念非常熟悉. 在JVM平台上有非 ...

  3. LeetCode102 Binary Tree Level Order Traversal Java

    题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...

  4. Redis安装以及配置

    下载 http://redis.io/download 解压 tar zxvf redis-2.8.17.tar.gz 编译并安装 1 2 3 4 cd redis-2.8.17 make cd sr ...

  5. 高阶函数sort

    排序中我们经常会用sort这个高阶函数,我们今天就来讲讲这个sort的比较机制,对于数字来说我们只需要比较他们的大小就可以了 但是 var arr =[15,81,9,4,3]; alert(arr. ...

  6. POJ 2394 Dijkstra

    题意: 思路: 裸的Dijkstra 爆敲一发模板 //By SiriusRen #include <queue> #include <cstdio> #include < ...

  7. Android WebView页面加载优化

    目前webapp越来越多,体验也越来越好,为了能够更好的使用WebView展示出流畅的的页面,可以从以下几点做优化: WebView缓存 资源文件本地存储 减少耗时操作 客户端UI优化 可能有人会说了 ...

  8. php汉字转化为拼音函数

    <?php function Pinyin($_String, $_Code='gb2312'){ $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|ban ...

  9. Java 学习(15):Java 数据结构

    Java 数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) ...

  10. hdu 1863 畅通project kruskal || prim

    简单最小生成树,畅通project.这三道题目都是练习最小生成树的. 注意一下推断是否有通路时,kruskal能够推断每一个点的祖先是否同样.prim能够推断每一个点是否都加进集合里面了,也就是说是否 ...