`
crazywen2011
  • 浏览: 40186 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Request、Response 之 Http 请求

    博客分类:
  • Web
阅读更多

今天说些什么呢?

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

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:

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

    在IT行业中,网络通信是核心部分之一,而`request`和`response`是HTTP协议中的两个基本概念,它们构成了客户端(如浏览器)与服务器端之间交互数据的核心机制。本篇文章将深入探讨这两个概念以及它们在实际开发中的...

    asp中的request response语句语法解析

    其中,`Request.Form`集合是处理POST请求时常用的一个属性,它按照表单元素的名称索引请求正文中的值。例如,如果有一个名为"hobby"的多选框表单字段,用户可能选择了多个爱好,那么可以使用`Request.Form("hobby")`...

    asp.net中Request与response常用属性方法

    在 ASP.NET 中,Request 和 Response 是两个非常重要的对象,它们分别代表了客户端的请求信息和服务器的响应信息。了解 Request 和 Response 的常用属性方法是 ASP.NET 开发的基础,本文将详细介绍 Request 和 ...

    request和response实现跳转和重定向的区别

    在Web开发中,请求(request)和响应(response)是HTTP协议的核心概念,它们是客户端与服务器交互的基础。在处理用户操作时,我们常常需要对页面进行跳转或重定向,这通常通过`request`和`response`对象来实现。这两者...

    python爬虫实现POST request payload形式的请求

    HTTP请求中的Form Data和Request Payload的区别 #### 1.1.1. Form Data - **GET请求**:参数直接附加在URL后面,如`http://news.baidu.com/ns?word=NBA&tn=news&from=news&cl=2&rn=20&ct=1`。 - **POST请求**:...

    request与response 详解

    - `Request`对象用于获取来自客户端(通常是通过HTTP协议)的所有请求信息,包括但不限于用户提交的数据、HTTP头信息、Cookies等。 2. **属性和方法**: - **参数获取**:可以通过`getParameter()`方法获取表单...

    ASP内置对象Request和Response详解

    除了基本的请求响应处理,`Request`和`Response`还支持更高级的功能,如SSL安全连接、上传文件、流媒体传输等。例如,通过`Request.BinaryRead`方法可以读取上传的二进制数据,而`Response.Flush`则可以在不结束脚本...

    request和response

    在探讨“request和response实现跳转和重定向的区别”这一主题时,我们深入研究了Web应用中的两个核心概念:Request和Response,以及它们如何通过不同的方法实现页面跳转和重定向,具体涉及到的方法包括Request的...

    response和request(web开发技术第四章)

    `response`是服务器对`request`的回应,包含了服务器处理请求后的结果。它包括HTTP状态码(如200表示成功,404表示未找到,500表示服务器内部错误),响应头(如Content-Type定义了返回内容的类型,如文本或图片),...

    nginx优化之request_time 和upstream_response_time差别1

    本文将深入探讨两个关键的响应时间指标:`request_time` 和 `upstream_response_time`,以及它们在实际应用中的区别。 `request_time` 是Nginx记录的从开始接收客户端的第一个字节到完成写入日志(即发送完所有响应...

    ASP.NET Core自定义中间件如何读取Request.Body与Response.Body的内容详解

    通过正确地备份、读取和恢复`Request.Body`和`Response.Body`,我们可以在自定义中间件中实现对请求和响应数据的全面监控。这在开发日志记录、安全审计或其他需要拦截请求和响应数据的场景中特别有用。理解这些核心...

    response request

    【标题】"响应请求"(Response Request)是一个关键的网络通信概念,特别是在Web开发和HTTP协议中。在HTTP协议中,客户端(通常是浏览器)向服务器发送一个请求(Request),服务器处理这个请求后会返回一个响应...

    ASp教程第四章-Response和Request

    在ASP(Active Server Pages)开发中,`Response`和`Request`对象是两个核心的内置对象,它们在处理客户端和服务器之间的数据交换中扮演着重要角色。本教程将深入讲解这两个对象及其相关知识点。 首先,`Request`...

    09_Java Web——Request&Response案例

    在"09_Java Web——Request&Response案例"这个主题中,我们聚焦于HTTP请求和响应这两个核心概念,它们是Web应用中客户端与服务器交互的基础。下面将详细阐述相关知识点。 1. **HTTP协议**:超文本传输协议(HTTP)...

    Struts2的Action中获得request response session几种方法

    以下将详细介绍如何在Struts2的Action中获取request、response、session。 ### 1. 使用ActionContext获取request、response、session Struts2的Action可以通过`ActionContext`来间接获取`request`、`response`和`...

    Request和Response.txt

    `Request`与`Response`对象是Web开发中的重要组成部分,它们使得服务器能够理解客户端的请求,并做出相应的处理和反馈。熟练掌握这两个对象的使用对于编写高效、健壮的Web应用程序至关重要。通过对以上内容的学习,...

    JAVAEE中Servlet实例Response与Request对象方法调用范例

    本实例主要探讨Servlet中的两个关键对象:HttpServletRequest(Request)和HttpServletResponse(Response),它们是Servlet API的核心组成部分,用于处理HTTP请求和构建响应。 Request对象是用于获取客户端发送的...

    struts2使用request、response

    ### Struts2中request与response的使用方法 #### 一、引言 Struts2作为Struts1的后续版本,在架构设计与实现机制上进行了大量的改进。相较于Struts1,Struts2对request、response、session等核心对象的处理方式有所...

    ASP第4章 Request和Response对象

    Request对象还包含TotalBytes属性,用于获取客户端请求数据的总字节数,以及BinaryRead方法,用于以二进制方式读取POST提交的数据。 Response对象的主要任务是向客户端输出数据。它可以是HTML文本、JavaScript代码...

    PyPI 官网下载 | http_request_response-0.0.8.tar.gz

    总的来说,`http_request_response-0.0.8.tar.gz`是一个专注于HTTP请求和响应的Python库,它的使用可以提高网络编程的效率,特别是对HTTP协议的理解和操作。了解和掌握这类库的使用,对提升Python网络编程技能有着...

Global site tag (gtag.js) - Google Analytics