android采用post方式获取服务器数据
地址:https://www.wendangku.net/doc/7513525524.html,/archives/464
Add a comment 1,597 viewsNovember 11th, 2011 Charlie
android, http, json android http post 请求, android 解析json
总结android 采用http请求访问网络并获取数据的步骤:
1.发送http请求,并传递相应的参数;
2.获取http返回的状态,根据返回的状态,如404错误,500错误,连接超时,请求异常等,并在界面提示相关状态;
3.web服务器端封装数据并返回一定格式的数据对象,例如封装json对象;
4.http状态返回正常,取出正确的参数并解析,如解析json对象;
5.解析服务器端返回的数据后显示在android相应的控件或存储本地数据,提示操作完成等。
因为习惯使用以上的5个步骤,于是写了一个相对完善的一个处理方法。以下主要是使用post 方式获取数据并解析封装的过程,封装json主要有两种封装方法:一种是单个json封装,另一种是带数组的json封装;解析json对应相应的方法。服务器端封装数据的语言采用php封装。get方式请求的方法过程类似。
1.发送服务器的http post请求方法
为了使编写的http post请求具有高度的可重用性,对于传递参数采用类似键值对的数组方式分别传递参数以及参数的值,String []key,String []value就是这样的一个类似键值对的传参方式。key是传递的参数,value是参数对应的值,url则是访问的地址。
HttpPostRequest .java源码:
view plaincopy to clipboardprint?
1.package com.httppost.main;
2.
3.import java.io.IOException;
4.import java.io.InterruptedIOException;
5.import java.io.UnsupportedEncodingException;
6.import java.util.ArrayList;
7.import java.util.List;
8.
9.import org.apache.http.HttpEntity;
10.import org.apache.http.HttpResponse;
11.import org.apache.http.client.ClientProtocolException;
12.import org.apache.http.client.entity.UrlEncodedFormEntity;
13.import org.apache.http.client.methods.HttpPost;
14.import org.apache.http.conn.ConnectTimeoutException;
15.import org.apache.http.impl.client.DefaultHttpClient;
16.import org.apache.http.message.BasicNameValuePair;
17.import org.apache.http.params.HttpConnectionParams;
18.import org.apache.http.protocol.HTTP;
19.import org.apache.http.util.EntityUtils;
20.
21.public class HttpPostRequest {
22.
23.private String webContext;
24.//返回请求内容
25.public String getWebContext() {
26.return webContext;
27.}
28.public void setWebContext(String webContext) {
29.this.webContext = webContext;
30.}
31.//该函数返回服务器访问的各种状态,并通过webContext传递获取的文本值
32./**
33.* 参数说明
34.* url 访问的网络地址
35.* key 传递参数的名称
36.* value 传递参数的值
37.* key 与value数组长度对应,即一对键值对,这样可以不限制参数传递的个数
38.* */
39.public int requestHttp(String url,String []key,String []value) {
40.// TODO Auto-generated method stub
41.int status = 0;
42.DefaultHttpClient mHttpClient = new DefaultHttpClient();
43.HttpPost mPost = new HttpPost(url);
44.List
45.int size=key.length;
46.for(int i=0;i 47.pairs.add(new BasicNameValuePair(key[i], value[i])); 48.} 49.try { 50.mPost.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8)); 51.} catch (UnsupportedEncodingException e1) { 52.// TODO Auto-generated catch block 53.e1.printStackTrace(); 54.} 55.try { 56.// Socket超时设置60s 57.mHttpClient.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,6000 0); 58.// 连接超时60s 59.mHttpClient.getParams().setIntParameter(HttpConnectionParams.CONNECTION_TIME OUT,60000); 60.HttpResponse response = mHttpClient.execute(mPost); 61.int res = response.getStatusLine().getStatusCode(); 62.if (res == 200) { 63.HttpEntity entity = response.getEntity(); 64.if (entity != null) { 65.String info = EntityUtils.toString(entity); 66.setWebContext(info); 67.status=1; 68.} 69.} else if (res == 404) { 70.status = 404; 71.} else if (res == 500) { 72.status = 500; 73.} 74.} catch (ClientProtocolException e) { 75.// TODO Auto-generated catch block 76. e.printStackTrace(); 77.status = 900; 78.} catch (ConnectTimeoutException e) { 79.// TODO Auto-generated catch block 80. e.printStackTrace(); 81.status = 901; 82.} catch (InterruptedIOException e) { 83.// TODO Auto-generated catch block 84. e.printStackTrace(); 85.status = 902; 86.} catch (IOException e) { 87.// TODO Auto-generated catch block 88. e.printStackTrace(); 89.status = 903; 90.} 91.return status; 92.} 93.} 2.获取服务器端返回http状态的提示及处理方法 根据服务器返回的状态提示相应的信息的类,可以根据实际需要自定义提示状态,例如登录,注册等提示。 Http_Status_Tips.java源码: view plaincopy to clipboardprint? 1.package com.httppost.main; 2. 3.import android.app.ProgressDialog; 4.import android.content.Context; 5.import android.widget.Toast; 6. 7.public class Http_Status_Tips { 8.//服务器端返回的状态提示 9.public static final String HTTP_0="其他错误"; 10.public static final String HTTP_1=""; 11.public static final String HTTP_404="404错误,请求链接无效"; 12.public static final String HTTP_500="网络500错误,服务器端程序出错"; 13.public static final String HTTP_900="网络传输协议出错"; 14.public static final String HTTP_901="连接超时"; 15.public static final String HTTP_902="网络中断"; 16.public static final String HTTP_903="网络数据流传输出错"; 17.public static final String HTTP_UNKONW="未知的错误"; 18. 19.//自定义的提示 20.private String tips; 21. 22.public void ShowHttpStatusTips(int status,Context context,ProgressDialog pr oDialog){ 23.switch(status){ 24.case0: 25.Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); 26.break; 27.case1: 28.//Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); 29.break; 30.case2: 31.Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); 32.break; 33.case3: 34.Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); 35.break; 36.case404: 37.Toast.makeText(context, HTTP_404, Toast.LENGTH_LONG).show(); 38. 39.break; 40.case500: 41.Toast.makeText(context, HTTP_500,Toast.LENGTH_LONG).show(); 42.break; 43.case900: 44.Toast.makeText(context, HTTP_900, Toast.LENGTH_LONG).show(); 45.break; 46.case901: 47.Toast.makeText(context, HTTP_901, Toast.LENGTH_LONG).show(); 48.break; 49.case902: 50.Toast.makeText(context, HTTP_902, Toast.LENGTH_LONG).show(); 51.break; 52.case903: 53.Toast.makeText(context, HTTP_903, Toast.LENGTH_LONG).show(); 54.break; 55.default: 56.Toast.makeText(context, HTTP_UNKONW, Toast.LENGTH_LONG).show(); 57.break; 58.} 59.if(proDialog!=null) 60.proDialog.dismiss(); 61.} 62. 63.public String getTips() { 64.return tips; 65.} 66.public void setTips(String tips) { 67.this.tips = tips; 68.} 69. 70.} 3.服务器端封装json数据的方法 采用php语言封装json的两种格式,数据可以是从数据库返回的数组,本例只采用简单的赋值方式返回数据。$_POST["type"]对应的是post的请求方式获取参数值。 (1.)封装单个json对象 json_1.php view plaincopy to clipboardprint? 1. 2.//对于POST的请求 3.$type=$_POST["type"]; 4.$arr = array( 5. 6.'id'=>'2', 7. 8.'username'=>'william', 9. 10.'lat'=>'113.09', 11. 12.'lon'=>'22.2982', 13. 14.'type'=>'传递参数:'.$type 15.); 16.echo json_encode($arr); 17.?> (2.)封装带数组的json对象 json_2.php view plaincopy to clipboardprint? 1. 2.//对于POST的请求 3.$type=$_POST["type"]; 4. 5.$arr=array(); 6. 7.$a = array( 8. 9.'id'=>'1', 10. 11.'username'=>'charlie', 12. 13.'lat'=>'113.09832', 14. 15.'lon'=>'22.29322', 16. 17.'type'=>'传递参数:'.$type 18.); 19.$b = array( 20. 21.'id'=>'2', 22. 23.'username'=>'william', 24. 25.'lat'=>'113.09', 26. 27.'lon'=>'22.2982', 28. 29.'type'=>'传递参数:'.$type 30.); 31.//将两个数组合并成一个数组 32.array_push($arr,$a); 33.array_push($arr,$b); 34.//封装成json_2的json 35.echo "{\"json_2\":".json_encode($arr)."}"; ?> 4.解析json的两种方法 两种解析json的方法:一个是解析单一的json对象(返回字符串数组),另一个是解析带数组对象的json对象(返回ArrayList的对象)。同样采用key-value的方式获取数值,适应封装不同参数的类型。 Json.java源码 view plaincopy to clipboardprint? 1.package com.httppost.main; 2. 3.import java.util.ArrayList; 4.import java.util.HashMap; 5. 6.import org.json.JSONArray; 7.import org.json.JSONException; 8.import org.json.JSONObject; 9. 10.public class Json { 11. 12.// 解析单一的json封装,并返回字符串数组 13./** 14.* 参数说明: 15.* 1.webContent 获取的网页封装的json格式数据 16.* 2.key 以数组形式组成的json的键名称 17.* */ 18.public String[] getJSON(String webContent, String[] key) { 19.int size = key.length; 20.String[] s = new String[size]; 21.try { 22.JSONObject jsonObject = new JSONObject(webContent); 23.for (int j = 0; j < size; j++) { 24.s[j] = jsonObject.getString(key[j]); 25.System.out.println(key[j] + "===string===" 26.+ jsonObject.getString(key[j])); 27.} 28.} catch (JSONException e) { 29.// TODO Auto-generated catch block 30. e.printStackTrace(); 31.s = null; 32.} 33.return s; 34.} 35. 36.// 获取数组型的结构,返回ArrayList 数据 37./** 38.* 参数说明: 39.* 1.webContent 获取的网页封装的json格式数据 40.* 2.key 以数组形式组成的json的键名称 3.jsonName 41.* 封装json数组数据的json名称 42.* */ 43. 44.public ArrayList 45.String[] key, String jsonName) { 46.ArrayList 47.JSONArray jsonObject; 48.try { 49.jsonObject = new JSONObject(webContent).getJSONArray(jsonName); 50.list = new ArrayList 51.for (int i = 0; i < jsonObject.length(); i++) { 52.JSONObject jsonObject2 = (JSONObject) jsonObject.opt(i); 53.HashMap 54.for (int j = 0; j < key.length; j++) { 55.map.put(key[j], jsonObject2.getString(key[j])); 56.System.out.println(key[j] + "===" 57.+ jsonObject2.getString(key[j])); 58.} 59.list.add(map); 60.} 61. 62.} catch (JSONException e) { 63.// TODO Auto-generated catch block 64. e.printStackTrace(); 65.list = null; 66.} 67.return list; 68.} 69.} 5.线程处理服务器状态并解析相应的数据方法 android中Thread与Handler结合使用的方法,主要调用http请求,提示相应的状态,处理json数据等。 HttpThread.java源码 view plaincopy to clipboardprint? 1.package com.httppost.main; 2. 3.import java.util.ArrayList; 4.import java.util.HashMap; 5. 6.import android.app.ProgressDialog; 7.import android.content.Context; 8.import android.os.Handler; 9.import android.os.Message; 10.import android.widget.Toast; 11. 12.public class HttpThread extends Thread{ 13. 14.private Context context; 15.private ProgressDialog proDialog; 16.private String url; 17.private String []key; 18.private String []value; 19.private String []jsonKey; 20.private String jsonName; 21. 22.private String []array; 23.ArrayList 24. 25.public HttpThread(Context context,ProgressDialog proDialog){ 26.this.context=context; 27.this.proDialog=proDialog; 28.} 29. 30.@Override 31.public void run(){ 32.Message msg = handler.obtainMessage(); 33.HttpPostRequest post=new HttpPostRequest(); 34.int res=post.requestHttp(url, key, value); 35.String webContent=post.getWebContext(); 36.msg.what=res; 37.if(res==1){ 38.//解析json 39.Json json=new Json(); 40.if(jsonName!=null) 41.//解析数组型的json 42.list=json.getJSONArray(webContent, jsonKey, jsonName); 43.else 44.//解析单个json值 45.array=json.getJSON(webContent, jsonKey); 46.} 47.handler.sendMessage(msg); 48.} 49.private Handler handler = new Handler() { 50.// TODO Auto-generated constructor stub 51.@Override 52.public void handleMessage(Message msg) { 53.// TODO Auto-generated method stub 54.super.handleMessage(msg); 55.int what=msg.what; 56.Http_Status_Tips status=new Http_Status_Tips(); 57.//返回成功数据时 58.if(what==1){ 59.//处理数组型json 60.if(list!=null){ 61.int size=list.size(); 62.String result=""; 63.for(int i=0;i 64.int s=jsonKey.length; 65.//迭代jsonKey数组值 66.for(int j=0;j 67.result+=jsonKey[j]+":"+list.get(i).get(jsonKey[j])+"\n"; 68.} 69.result+="\n"; 70.} 71.Toast.makeText(context, result, Toast.LENGTH_LONG).show(); 72.} 73.//处理单个字符json 74.if(array!=null){ 75.int arraySize=array.length; 76.String rs=""; 77.for(int k=0;k 78.rs+=jsonKey[k]+":"+array[k]+"\n"; 79.} 80.Toast.makeText(context, rs, Toast.LENGTH_LONG).show(); 81.} 82.} 83.//根据服务器端返回数据,自定义提示 84.else if(what==2){ 85.status.setTips("自定义提示2"); 86.}//根据服务器端返回数据,自定义提示 87.else if(what==3){ 88.status.setTips("自定义提示3"); 89.} 90.status.ShowHttpStatusTips(what, context,proDialog); 91.} 92.}; 93. 94.//activity界面传递的参数 95.public String getUrl() { 96.return url; 97.} 98. 99.public void setUrl(String url) { 100.t his.url = url; 101.} 102. 103.p ublic String[] getKey() { 104.r eturn key; 105.} 106. 107.p ublic void setKey(String[] key) { 108.t his.key = key; 109.} 110. 111.p ublic String[] getValue() { 112.r eturn value; 113.} 114. 115.p ublic void setValue(String[] value) { 116.t his.value = value; 117.} 118. 119.p ublic String[] getJsonKey() { 120.r eturn jsonKey; 121.} 122. 123.p ublic void setJsonKey(String[] jsonKey) { 124.t his.jsonKey = jsonKey; 125.} 126. 127.p ublic String getJsonName() { 128.r eturn jsonName; 129.} 130. 131.p ublic void setJsonName(String jsonName) { 132.t his.jsonName = jsonName; 133.} 134.} 6.activity传递并调用线程处理方法 activity界面中调用HttpThread的方法,主要实现数值参数的传递,并返回具体的数组。通过两个按钮获取不同类型的json数据对象,获取服务器端数据的主要方法采用Toast显示,如图-1。 HttpPostActivity.java源码 view plaincopy to clipboardprint? 1.package com.httppost.main; 2. 3.import android.app.Activity; 4.import android.app.ProgressDialog; 5.import android.os.Bundle; 6.import android.view.View; 7.import android.view.View.OnClickListener; 8.import android.widget.Button; 9. 10.public class HttpPostActivity extends Activity { 11./** Called when the activity is first created. */ 12.@Override 13.public void onCreate(Bundle savedInstanceState) { 14.super.onCreate(savedInstanceState); 15.setContentView(https://www.wendangku.net/doc/7513525524.html,yout.main); 16.Button jsonBtn = (Button) findViewById(R.id.get_array_json); 17.jsonBtn.setOnClickListener(jsonClick); 18.Button listBtn = (Button) findViewById(R.id.get_list_json); 19.listBtn.setOnClickListener(listClick); 20.} 21.//获取单个json封装的数据 22.OnClickListener jsonClick = new OnClickListener() { 23. 24.@Override 25.public void onClick(View v) { 26.// TODO Auto-generated method stub 27.ProgressDialog proDialog = ProgressDialog.show(v.getContext(), "", 28."正在获取数据……", true, true); 29.HttpThread jsonThread = new HttpThread(v.getContext(), proDialog); 30.String url = "http://10.0.2.2/json/json_1.php"; 31.// url传递参数 32.String[] key = { "type" }; 33.String[] value = { "0" }; 34.// php页面返回的json键 35.String[] jsonKey = { "id", "username", "lat", "lon","type" }; 36.//传递相应的参数 37.jsonThread.setUrl(url); 38.jsonThread.setKey(key); 39.jsonThread.setValue(value); 40.jsonThread.setJsonKey(jsonKey); 41.jsonThread.start(); 42.} 43.}; 44.//获取带数组类型的封装 45.OnClickListener listClick = new OnClickListener() { 46. 47.@Override 48.public void onClick(View v) { 49.// TODO Auto-generated method stub 50.ProgressDialog proDialog = ProgressDialog.show(v.getContext(), "", 51."正在获取数据……", true, true); 52.HttpThread jsonThread = new HttpThread(v.getContext(), proDialog); 53.String url = "http://10.0.2.2/json/json_2.php"; 54.// url传递参数 55.String[] key = { "type" }; 56.String[] value = { "1" }; 57.// php页面返回的json键 58.String[] jsonKey = { "id", "username", "lat", "lon","type" }; 59.String jsonName="json_2"; 60.//传递相应的参数 61.jsonThread.setUrl(url); 62.jsonThread.setKey(key); 63.jsonThread.setValue(value); 64.jsonThread.setJsonName(jsonName); 65.jsonThread.setJsonKey(jsonKey); 66.jsonThread.start(); 67.} 68.}; 69.} 布局文件 main.xml view plaincopy to clipboardprint? 1. 2. 3.android:orientation="vertical" 4.android:layout_width="fill_parent" 5.android:layout_height="wrap_content"> 6. 7.android:layout_height="wrap_content" 8.android:layout_margin="12dip" 9.android:textSize="18dip" 10.android:gravity="center_horizontal" 11.android:text="post请求获取json数据"/> 12. AndroidManifest.xml加入网络访问权限 view plaincopy to clipboardprint? 1. 2. 3. 图-1 显示获取json数据 ****************************************************************** ******************************************************************* Windows操作系统中的IIS负责提供互联网服务,一台运行了IIS的计算机可以看成是一台Web服务器。 Windows XP SP2 中IIS主版本号为5,Windows 2003 Server为6,Vista和Windows Server 2008为7。对于Windows 2003 Server,其默认支持的https://www.wendangku.net/doc/7513525524.html,版本为1.1,因此必须单独安装.NET Framework 2.0以上版本[1]。 目前,IIS 6是使用最为广泛的版本,IIS 5已基本不在Web服务器上部署, IIS 6与IIS 5相比在系统架构上有着较大的差异,IIS 7与IIS 6相比,基本架构并没有根本性的变化,但在许多方面有新的增强和改进。本书选择IIS 6/7进行介绍,大部分内容也适合于IIS 5,但IIS 5一些已过时的特性就不介绍了。 首先,我们来仔细分辨一下三个很容易混淆的基本概念。 8.1.1网站、Web应用程序和虚拟目录 在IIS中可以创建网站、Web 应用程序和虚拟目录,以便与计算机网络上的用户共享信息。“网站”、“Web 应用程序”和“虚拟目录”这三个概念的关系如图 8?1所示。 图 8?1 网站,应用程序与虚拟目录 简而言之,一个“网站(Web Site)”包含一个或多个“ Web 应用程序(Web Application)”,一个Web 应用程序包含一个或多个“虚拟目录(Virtual Directory)”,而虚拟目录则映射到 Web 服务器或远程计算机上的物理目录。 图 8?2所示为运行IIS 7的一个Web服务器。 图 8?2 IIS 7中的网站,应用程序与虚拟目录 图 8?2中可以清楚地看到此Web服务器上有两个“网站”:Default Web Site和NewWebSite,其中Default Web Site网站中有三个“Web 应用程序”:HappyBookShopService、HappyBookShopWebSite和OnlineAlbum。而HappyBookShopWebSite应用程序下的每一个子文件夹都是一个“虚拟目录”。最顶层的虚拟目录称为“根虚拟目录”,图8?2中Web应用程序HappyBookShopWebSite的根虚拟目录为“/HappyBookShopWebSite”。 HTTP协议报文格式 HTTP协议(Hypertext Transfer Protocol――超文本传输协议)浏览器端(客户端)向WEB 服务器端访问页面的过程和HTTP协议报文的格式。 基于HTTP协议的客户机访问包括4个过程,分别是建立TCP套接字连接、发送HTTP请求报文、接收HTTP应答报文和关闭TCP套接字连接: 1. 创建TCP套接字连接 客户端与WEB服务器创建TCP套接字连接,其中WEB端服务器的地址可以通过域名解析确定,WEB端的套接字侦听端口一般是80。 2. 发送HTTP请求报文 客户端向WEB服务端发送请求报文,HTTP协议的请求报文格式为: 请求消息= 请求行(实体头信息)CRLF[实体内容] 请求行= 方法URL HTTP版本号CRLF 方法= GET|HEAD|POST|扩展方法 URL = 协议名称+宿主名+目录与文件名 其中"CRLF"表示回车换行。 "请求行"中的"方法"描述了对指定资源执行的动作,常用的方法"GET"、"HEAD"和"POST"等3种,它们的含义如表15-8所示: 请求报文 一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。 (1)请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。 HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。 GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾 与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。 表15-8 HTTP请求方法 HTTP头字段包括4类: general-header ; request-header ; response-header ; entity-header . ********************************************************************* ********** General Header Fields ============================= general header是request、response都可用的, 但是不能用于entity. --Cache-Control --Connection --Date --Pragma --Trailer --Transfer-Encoding --Upgrade --Via --Warning ********************************************************************* ********** Request Header Fields ====================== request-header fields 允许客户端传递关于request和客户端的附加信息到服务端, --Accept --Accept-Charset --Accept-Encoding --Accept-Language --Authorization --Expect --From --Host --If-Match --If-Modified-Since --If-None-Match --If-Range --If-Unmodified-Since 一、HTTP响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。 响应码分五种类型,由它们的第一位数字表示: 1xx: 信息,请求收到,继续处理 2xx: 成功,行为被成功地接受、理解和采纳 3xx: 重定向,为了完成请求,必须进一步执行的动作 4xx: 客户端错误,请求包含语法错误或者请求无法实现 5xx: 服务器错误,服务器不能实现一种明显无效的请求 下表显示每个响应码及其含义: 100继续 101分组交换协 200 OK 201被创建 202被采纳 203非授权信息 204无内容 205重置内容206部分内容300多选项 301永久地传送302找到 303参见其他304未改动 305使用代理307暂时重定向400错误请求401未授权 402要求付费403禁止 404未找到 405不允许的方法406不被采纳407要求代理授权408请求超时409冲突 410过期的 411要求的xx 412前提不成立 413请求实例太大 414请求URIxx 415不支持的媒体类型 416无法满足的请求范围 417失败的预期 500内部服务器错误 501未被使用 502网关错误 503不可用的服务 504网关超时 505 HTTP版本未被支持 二、HTTP头标由主键/值对组成。它们描述客户端或者服务器的属性、被传输的资源以及应该实现连接。 四种不同类型的头标: 1.通用头标: 即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。 2.请求头标: 允许客户端传递关于自身的信息和希望的响应形式。 3.响应头标: 服务器和于传递自身信息的响应。 4.实体头标: 定义被传送资源的信息。即可用于请求,也可用于响应。 头标格式: HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。 HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式。 2.简单快速: 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、H EAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 5.无状态: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 一、HTTP协议(URL) http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。 HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下: http: //host[": "port][abs_path] 二、HTTP协议的请求 http请求由三部分组成,分别是: 请求行、消息报头、请求正文 1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下: Method Request-URI HTTP-Version CRLF 其中Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。 请求方法(所有方法全为大写)有多种,各个方法的解释如下: GET 请求获取Request-URI所标识的资源 POST 在Request-URI所标识的资源后附加新的数据 HEAD 请求获取由Request-URI所标识的资源的响应消息报头 PUT 请求服务器存储一个资源,并用Request-URI作为其标识 HTTP是Web协议集中的重要协议,它是从客户机/服务器模型发展起来的。客户机/服务器是运行一对 相互通信的程序,客户与服务器连接时,首先,向服务器提出请求,服务器根据客户的请求,完成处理 并给出响应。浏览器就是与Web服务器产生连接的客户端程序,它的端口为TCP的80端口,。浏览器 与Web 服务器之间所遵循的协议就是HTTP。 HTTP的早期版本为HTTP/0.9,它适用于各种数据信息的简洁快速协议,但是其远不能满足日益发展各 种应用的需要。但HTTP/0.9作为HTTP协议具有典型的无状态性:每个事务都是独立进行处理的,当 一个事务开始就在客户与服务器之间建立一个连接,当事务结束时就释放这个连接。HTTP/0.9包含Simple-Request&Simple-Responsed的报文结构。但是客户无法使用内容协商,所以服务器也无法 返回实体的媒体类型。 1982年,Tim Berners-Lee提出了HTTP/1.0,在此后的不断丰富和发展中,HTTP/1.0成为最重要 的面向事务的应用层协议。该协议对每一次请求/响应,建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。其缺点是仍会发生下列问题:对用户请求响应慢、网络拥 塞严重、安全性等。 1997年形成的HTTP/1.1,也就是现在普遍使用的协议,在持续连接操作机制中实现流水方式,即客户 端需要对同一服务器发出多个请求时,其实现在多数的网页都是有多部分组成(比如多张图片),可用 流水线方式加快速度,流水机制就是指连续发出多个请求并等到这些请求发送完毕,再等待响应。这样 就大大节省了单独请求对响应的等待时间,使我们得到更快速的浏览。 另外,HTTP/1.1服务器端处理请求时按照收到的顺序进行,这就保证了传输的正确性。当然,服务器端 在发生连接中断时,会自动的重传请求,保证数据的完整性。 HTTP/1.1还提供了身份认证、状态管理和Cache缓存等机制。这里,我想特别提一下关于HTTP/1.1 中的Cache缓存机制对 HTTP/1.0的不足之处的改进,它严格全面,既可以减少时间延迟、又节省了带宽。HTTP/1.1采用了内容协商机制,选择最合适的用户的内容表现形式。 现在,很多地方都有用到的虚拟主机技术在HTTP/1.1中也可以实现。所谓的虚拟主机技术,就是同一 主机地址实际对应多台主机。通俗的讲,当你同时在一个网站申请两个主页时,用协议分析仪可以发现 其实这两个主页对应的是同一个IP地址。这样用多台完全相同的机器形成WWW服务器就可以提高处 理的吞吐量。 传统的解决方案是改造域名服务器使其可以根据一定的算法将同一域名解释成不同的IP地址。分别对应 虚拟主机的每台机器,其缺点是要求每台机器占用完全独立的IP地址,这与IP地址的缺乏是相矛盾的。HTTP/1.1提供的解决方案在HTTP协议自身中加入了指定不同主机的功能,从而多台主机可以共享一个IP地址,既提高了性能又便于管理。 因为HTTP/1.1是Internet现行的标准协议,这里详细介绍其相关语法。 首先,HTTP/1.1格式可写为: 其中请求方法是请求一定的Web页面的程序或用于特定的URL。可选用下列几种: GET:请求指定的页面信息,并返回实体主体。 HEAD:只请求页面的首部。 POST:请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。 PUT:从客户端向服务器传送的数据取代指定的文档的内容。 实验12 HTTP 协议分析实验 一、实验目的 在PC 机上登录Web 页面,截获报文,分析HTTP 协议的报文格式和HTTP协议的工作过程。 二、实验说明 独立完成各自实验 三、实验内容 在一台计算机上截获不同类型HTTP报文进行分析。 四、实验步骤 1.在PC 机上运行Sniffer,设置过滤器,开始截获报文; 2.从浏览器上访问Web 界面,如http://202.202.4 3.125。打开网页,待浏览器的状 态栏出现“完毕”信息后关闭网页。 3.停止截获报文,将截获的报文命名为http1-座号-姓名保存。 4.分析截获的报文,回答以下几个问题: ?在截获的HTTP 报文中,任选一个HTTP 请求报文和对应的 HTTP 应答报文, 仔细分析它们的格式,填写下面两个表格。 ? ? 表2 HTTP 应答报文格式 分析在截获的报文中,客户机与服务器建立了几个连接?服务器和客户机分别使用了哪几个端口号? 建立了10个连接,服务器使用率1281,1282,1283,1284,1285,1286,1287,1288,1289端口,客户端使用80端口 1.获取长文件 (1)启动浏览器,将浏览器的缓存清空。 (2)启动Sniffer,设定过滤器HTTP,在浏览器地址栏中输入以下网址:https://www.wendangku.net/doc/7513525524.html,/wireshark-labs/HTTP-wireshark-file3.html 浏览器将显示一个相当大的美国权利法案。 (3)停止Sniffer,保存为:http2-座号-姓名,回答以下问题。 ?一共发出了多少个HTTP GET请求? 4个GET请求 ?承载这个HTTTP响应报文需要多少个data-containing TCP报文段? 一共需要4个TCP报文段 ?与GET请求相对应的响应报文状态码和状态短语是什么?。 状态码:302 状态短语:Found ?在被传送的数据中共有多少个HTTP状态行与TCP-induced continuation有 关? 有,对于一个大的HTML文件会被TCP分为若干个独立的小包传输,他们是连 续的,如下图 2.嵌有对象的HTML文档 (1)启动浏览器,将浏览器的缓存清空。 (2)启动Sniffer,设定过滤器HTTP,在浏览器地址栏中输入以下网址: https://www.wendangku.net/doc/7513525524.html,/wireshark-labs/HTTP-wireshark-file5.html 浏览器将显示一个具有两个图片的短HTTP文件。 竭诚为您提供优质文档/双击可除 http协议交互过程 篇一:wireshake抓包分析tcp与http过程详解 http协议报文格式详解 在我们日常生活中最常见的应用环境就是上网浏览网页,很多上班族到办公室的第一件事就是打开电脑,而开机后的第一件事就是打开ie、Firefox、myie、greenbrowser、opera等浏览器时,做的第一件事就是浏览一下例如.cn,的新闻,而这种简单的应用操作,完成的交互过程就是一个典型的http协议的应用过程。 http是基于tcp的连接,因此,建立http连接必须经过tcp的过程,tcp的建立过程是3次握手的过程。然后就是http过程,http只有两种报文,请求和应答报文。完成http过程后,3次断开tcp连接。 http tcp的第一阶段 http开始之前先3次握手,第一阶段就是客户向服务器发送同步请求,flag字段的syn位置1。 第二阶段 第二阶段就是服务器向客户回复一个ack包,其中Flag 字段的syn位和ack字段置1。 tcp的第三阶段: tcp的第三阶段是客户向服务器发送ack,至此,tcp的3次握手结束 tcp三次握手结束之后就是http请求 客户发出http请求之后,服务器收到请求发送ack: 服务器发送应答报文 篇二:http协议分析报告实例 http协议分析 1实验目的 分析http协议报文首部格式,理解http协议工作过程2实验内容 截获http报文,分析http协议报文首部格式,学习http 协议工作过程。3实验原理 超文本传送协议http(hypertexttransferprotocol),是万维网客户程序与万维网服务器程序之间的交互所要严 格遵守的协议。http是一个应用层协议,它使用tcp连接进行可靠的传送。对于万维网站点的访问要使用的http协议。 http的uRl的一般形式是:http://:/ www采用b/s结构,客户使用浏览器在uRl栏中输入http 请求,即输入对方服务器的地址,向web服务器提出请求。 1、发起请求 下面这个方法的作用就是接收要发送的数据及数据要发送到的URL,然后返回响应数据 protected string SendRequest(string data,string url) { WebRequest req = WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; byte[] sendBytes = Encoding.UTF8.GetBytes(data); req.ContentLength = sendBytes.Length; Stream reqStream = req.GetRequestStream(); reqStream.Write(sendBytes, 0, sendBytes.Length); reqStream.Close(); WebResponse res = req.GetResponse(); Stream resStream = res.GetResponseStream(); StreamReader sr = new StreamReader(resStream, Encoding.UTF8); string resData = sr.ReadToEnd(); sr.Close(); resStream.Close(); return resData; } 使用示例: protected void btnSubscribe_Click(object sender, EventArgs e) { string FileName = Server.MapPath("订购.xml"); 竭诚为您提供优质文档/双击可除http协议数据包格式 篇一:数据包格式 tcp/ip协议族包括诸如internet协议(ip)、地址解析协议(aRp)、互联网控制信息协议(icmp)、用户数据报协议(udp)、传输控制协议(tcp)、路由信息协议(Rip)、telnet、简单邮件传输协议(smtp)、域名系统(dns)等协议。tcp/ip 协议的层次结构如图3所示。 图3tcp/ip协议层次结构 (1)应用层应用层包含一切与应用相关的功能,相当于osi的上面三层。我们经常使用的http、Ftp、telnet、smtp 等协议都在这一层实现。 (2)传输层传输层负责提供可靠的传输服务。该层相当于osi模型中的第4层。在该层中,典型的协议是 tcp(transmissioncontrolprotocol)和 udp(userdatagramprotocol)。其中,tcp提供可靠、有序的,面向连接的通信服务;而udp则提供无连接的、不可靠用户数据报服务。 (3)网际层网际层负责网络间的寻址和数据传输,其功 能大致相当于osi模型中的第3层。在该层中,典型的协议是ip(internetprotocol)。 (4)网络接口层最下面一层是网络接口层,负责数据的实际传输,相当于osi模型中的第1、第2层。在tcp/ip协议族中,对该层很少具体定义。大多数情况下,它依赖现有的协议传输数据。 tcp/ip与osi最大的不同在于osi是一个理论上的网络通信模型,而tcp/ip则是实际运行的网络协议。tcp/ip实际上是由许多协议组成的协议簇。图4示出tcp/ip的主要协议分类情况。 整个过程: 1.dhcp请求ip地址的过程 l发现阶段,即dhcp客户端寻找dhcp服务器的阶段。客户端以广播方式发送dhcpdiscoVeR包,只有dhcp服务器才会响应。 l提供阶段,即dhcp服务器提供ip地址的阶段。dhcp 服务器 接收到客户端的dhcpdiscoVeR报文后,从ip地址池中选择一个尚未分配的ip地址分配给客户端,向该客户端发送包含租借的ip地址和其他配置信息的dhcpoFFeR包。 l选择阶段,即dhcp客户端选择ip地址的阶段。如果有多台dhcp服务器向该客户端发送 .NET平台处理HTTP请求 .NET平台处理HTTP请求的过程大致如下: 1、IIS得到一个请求;,。 2、查询脚本映射扩展,然后把请求映射到文件 3、代码进入工作者进程(IIS5里是;IIS6里是,工作者进程也叫辅助进程; 4、 .NET运行时被加载; 5、非托管代码调用()方法; 6、每一个请求调用一个IsapiWorkerRequest; 7、使用WorkerRequest调用()方法; 8、通过传递进来的WorkerRequest创建一个HttpContext对象 9、通过把上下文对象作为参数传递给(),然后调用该方法,从应用程序池中获取一个HttpApplication实例; 10、调用(),启动管道事件序列,钩住模块和处理器; 11、调用,开始处理请求; 12、触发管道事件; 13、调用HTTP处理器和ProcessRequest方法; 14、把返回的数据输出到管道,触发处理请求后的事件。 当客户端向Web服务器请求一个页面文件时,这个HTTP请求会被进程截获(WWW服务),它判断文件后缀,如果是*.aspx、*.asmx等,就把这个请求转交给,而则会通过一个Http PipeLine的管道,将这个HTTP请求发送给进程,当这个HTTP请求进入进程之后, framework就会通过HttpRuntime来处理这个HTTP 请求,处理完毕后将结果返回给客户端。 当一个HTTP请求被送入到HttpRuntime之后,这个HTTP请求通过HTTP管道(HttpRuntime是HTTP管道的入口)被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的HTTP请求,同时HttpApplication实例会创建一个HttpContext对象来记录HTTP请求的上下文,而后这个HTTP请求会依次进入到如下几个容器中:HttpModule --> HttpHandler Factory --> HttpHandler当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了。 如果想在中途截获一个HttpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。 过程详解: 从本质上讲,主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是的一个主要入口,它有一个ProcessRequest方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime类几乎包含着关于单个Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http头信息等等。使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,就是HTML页面;二般来说,也可以是张图片^_^。 HTTP协议分析 1 实验目的 分析HTTP协议报文首部格式,理解HTTP协议工作过程 2 实验内容 截获HTTP报文,分析HTTP协议报文首部格式,学习HTTP协议工作过程。 3 实验原理 超文本传送协议HTTP(HyperText Transfer Protocol),是万维网客户程序与万维网服务器程序之间的交互所要严格遵守的协议。HTTP是一个应用层协议,它使用TCP连接进行可靠的传送。对于万维网站点的访问要使用的HTTP协议。 HTTP的URL的一般形式是: http://<主机>:<端口>/<路径> WWW采用 B/S 结构,客户使用浏览器在 URL栏中输入 HTTP 请求,即输入对方服务器的地址,向 web 服务器提出请求。如访问师院的机构设置页面 https://www.wendangku.net/doc/7513525524.html,/jigou/gljg.htm,具体的工作过程如下: (1) 浏览器分析指向页面的URL. (2) 浏览器向DNS请求解析https://www.wendangku.net/doc/7513525524.html,的IP地址。 (3) 域名系统DNS解析出师院服务器的IP地址 (4) 浏览器与服务器建立TCP连接 (5) 浏览器发出取文件命令:GET /jigou/gljg.htm. (6) 服务器https://www.wendangku.net/doc/7513525524.html,给出响应,将文件 gljg.htm发送给浏览器。 (7) TCP连接释放。 (8) 浏览器显示“北航机构设置”的页面。 服务器提供的默认端口号为80. 4 实验步骤 步骤 1 在计算机上打开wireshark软件,进行报文截获。 步骤 2 从浏览器上访问https://www.wendangku.net/doc/7513525524.html,页面,具体操作为打开网页,浏览,关掉网页。 步骤 3 停止wireshark的报文截获,结果命名为http_学号,保存在本机或上 传至服务器目录下。 http请求与响应过程 (1)请求方法URI协议/版本 请求的第一行是“方法URL议/版本”:GET/sample.jsp HTTP/1.1 以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。 根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1目前支持7种请求方法:GET、POST、HEAD、OPTIONS、 PUT、DELETE和TARCE。 GET 请求获取由Request-URI所标识的资源。 POST 在Request-URI所标识的资源后附加新的数据。 HEAD 请求获取由Request-URI所标识的资源的响应消息报头。 OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。 PUT 请求服务器存储一个资源,并用Request-URI作为其标识。 DELETE 请求服务器删除由Request-URI所标识的资源。 TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。 在Internet应用中,最常用的方法是GET和POST。 URI完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最 后,协议版本声明了通信过程中使用HTTP的版本。 (2)服务器响应状态码 状态代码: 状态代码由3位数字组成,表示请求是否被理解或被满足。 状态描述: 状态描述给出了关于状态代码的简短的文字描述。 状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。 第一个数字有五种可能的取值: - 1xx: 指示信息—表示请求已接收,继续处理。 - 2xx: 成功—表示请求已经被成功接收、理解、接受。 - 3xx: 重定向—要完成请求必须进行更进一步的操作。 - 4xx: 客户端错误—请求有语法错误或请求无法实现。 - 5xx: 服务器端错误—服务器未能实现合法的请求。 状态代码状态描述说明 200 OK --客户端请求成功 400 Bad Request --由于客户端请求有语法错误,不能被服务器所理解。 401 Unauthonzed --请求未经授权,请求身份认证。这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden --服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。 请求报文 一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。 (1)请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。 HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。 GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL 的结尾与请求参数的开始,传递参数长度受限制。例如, /index.jsp?id=100&op=bind。 POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。 (2)请求头部 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:User-Agent:产生请求的浏览器类型。 Accept:客户端可识别的内容类型列表。 Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。 (3)空行 最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。 (4)请求数据 开放式课题 实验报告 实验名称:基于Wireshark软件的HTTP协议分析 学号: 姓名: 指导教师:宫婧 指导单位:理学院 目录 实验目的..........................................................错误!未定义书签。 1) 掌握Wireshark软件使用方法............. 错误!未定义书签。 2)理解HTTP协议工作原理..................................... 错误!未定义书签。 实验任务.................................... 错误!未定义书签。 1) 抓取数据包........................... 错误!未定义书签。 2)分析数据包........................... 错误!未定义书签。实验环境.............................. 错误!未定义书签。软件介绍 (2) 1) wireshark软件简介 (2) 2) wireshark软件的应用 (2) 3) wireshark软件的价值 (2) 4) wireshark软件的操作简介 (3) HTTP协议详解............................... 错误!未定义书签。 1) HTTP协议基础概念....................... 错误!未定义书签。 2) HTTP协议工作流程....................... 错误!未定义书签。 3) HTTP协议请求响应信息 (6) HTTP请求报文信息....................................6 HTTP响应报文信息....................................7HTTP数据包分析 (8) 1)网络接口层信息 (10) 2)网络层信息 (11) 3)传输层信息 (12) 4)应用层信息 (13) 总结........................................ 错误!未定义书签。参考文献.. (14) 2xx 成功 200 正常;请求已完成。 201 正常;紧接 POST 命令。 202 正常;已接受用于处理,但处理尚未完成。 203 正常;部分信息—返回的信息只是一部分。 204 正常;无响应—已接收请求,但不存在要回送的信息。 3xx 重定向 301 已移动—请求的数据具有新的位置且更改是永久的。 302 已找到—请求的数据临时具有不同 URI。 303 请参阅其它—可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。 304 未修改—未按预期修改文档。 305 使用代理—必须通过位置字段中提供的代理来访问请求的资源。 306 未使用—不再使用;保留此代码以便将来使用。 4xx 客户机中出现的错误 400 错误请求—请求中有语法问题,或不能满足请求。 401 未授权—未授权客户机访问数据。 402 需要付款—表示计费系统已有效。 403 禁止—即使有授权也不需要访问。 404 找不到—服务器找不到给定的资源;文档不存在。 407 代理认证请求—客户机首先必须使用代理认证自身。 410 请求的网页不存在(永久); 415 介质类型不受支持—服务器拒绝服务请求,因为不支持请求实体的格式。 5xx 服务器中出现的错误 500 内部错误—因为意外情况,服务器不能完成请求。 501 未执行—服务器不支持请求的工具。 502 错误网关—服务器接收到来自上游服务器的无效响应。 503 无法获得服务—由于临时过载或维护,服务器无法处理请求。 100系列码 从100到199范围的HTTP状态码是信息报告码。基于各种原因考虑,大多数情况下我们是很少看见这些代码的。首先,如果一个浏览器尝试访问一个网站,而网站返回这些代码时,它们往往都不会显示在屏幕上。它们只是浏览器使引用的内部码。另外,这些代码不常见的另外一个原因是起初HTTP标准不允许使用这一范围的状态码。就其本身而言,它们也一直没有被广泛地使用。 200系列码 从 200到299范围的状态码是操作成功代码。同样的,在正常的Web上网中,你也很可能不曾在屏幕上看到这些代码。相反的,这些代码是在浏览器内部使用的,用以确认操作成功确认和当前请求状态。虽然这些代码通常不显示,但是有一些故障排除工具能够读到它们,就像和其它大多数的HTTP状态码一样,它们在错误诊断过程中是非常有用的。 1.你的浏览器运行的是,还是?你所访问的服务器所运行的HTTP版本号是多少? 答:HTTP version 4 2. 你的浏览器向服务器指出它能接收何种语言版本的对象? 答:Accept language: zh-CN\r\n 3. 你的计算机的IP地址是多少?服务器的IP地址是多少? 答:我的IP是:服务器: 从服务器向你的浏览器返回的状态代码是多少? 答:200 OK 5. 你从服务器上所获取的HTML文件的最后修改时间是多少? 答:如图 6.返回到你的浏览器的内容以供多少字节? 答:24370 在浏览器地址栏中如下网址: 分析你的浏览器向服务器发出的第一个HTTP GET请求的内容,在该请求报文中,是否有一行是:IF-MODIFIED-SINCE? 答:没有 9.分析服务器响应报文的内容,服务器是否明确返回了文件的内容?如何获知? 答:有 HTTP/ 200 OK(text/html) 10.分析你的浏览器向服务器发出的第二个“HTTP GET”请求,在该请求报文中是否有一行是:IF-MODIFIED-SINCE?如果有,在该首部行后面跟着的信息是什么? 答:仍然没有。如图。 11.服务器对第二个HTTP GET请求的响应中的HTTP状态代码是多少?服务器是否明确返回了文件的内容?请解释。 答:状态码和相应状态信息的值为304 NOT Modified,他表示缓存器可以使用该对象。第二次没有返回文件的内容,因为他只是作为对该条件GET的响应,WEB服务器只发送一个响应报文,不包含请求的对象。 12. 你的浏览器一共发出了多少个HTTP GET请求? 答:1个 13. 传输这一个HTTP响应需要多少个TCP报文段? 答:4个。 对HTTP协议的头信息详解 HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW 方式的数据,关于HTTP 协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。 通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。 通用头域 通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。 Cache-Control头域 Cache -Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下: Public指示响应可被任何缓存区缓存。 Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache指示请求或响应消息不能缓存 no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 Date头域 一、实验目的和要求 1、实验目的 HTTP客户端程序的功能是给出一个URL,要求程序能够获得指定URL所指向的内容,对于获得内容不必做进一步的处理,只打印HTML代码即可 ●通过HTTP客户端程序使学生掌握网络编程的基本知识和基 本技能; ●使学生掌握HTTP协议的常用命令; ●通过跟踪运行java网络包,使学生了解网络编程实现的细节。 2、实验要求 本实验要求实现一个简单的HTTP客户端,具体内容及要求如下: ●分析HTTP客户端程序的功能,要求能根据给定的URL,获 得URL指向的资源,对于资源的内容可以不做任何的处理, 直接打印即可; ●实现HTTP客户端程序; ●跟踪运行java网络包。 二、系统技术路线和运行环境 1、技术路线: 本系统采用Java语言开发,可以适应几乎所有支持JVM的操作系统。同时Java语言在网络领域的特殊优势,使得它所提供的类库中包含了较为丰富的网络编程API,可以使开发人员方便地开发网络通信类应用程序。 其次还采用了Tomcat6.0与jsp相结合的web建设、使得该系统能够更好的符合实验的要求和标准。 2、系统运行环境: ●硬件环境: PC机一台 ●软件环境: 操作系统:Windows XP、Tomcat6.0、jdk6.0、eclipse等 三、程序的逻辑框图 程序流逻辑框图能够帮助我们更好的熟悉和了解该系统的运行过程,本系统的一些逻辑框图如下所示: 四、程序源代码 1、基于URL的HttpClient.java程序代码如下:import java.awt.*; import java.awt.event.*; import java.io.*; import https://www.wendangku.net/doc/7513525524.html,.*; import javax.swing.*; public class HttpClient extends JApplet implements ActionListener { //创建一个按钮来点击事件 private JButton jbtView = new JButton("View"); //文本字段来接收文件的名字 private JTextField jtfURL = new JTextField(12);IIS架构与HTTP请求处理流程
http协议请求响应报文格式及状态码详解
HTTP请求报头详解
常用http响应报文分析
HTTP协议分析
HTTP请求方法及响应码详解(http get post head)
实验12 HTTP报文分析
http协议交互过程
运行时创建HTTP请求及请求的处理
http协议数据包格式
http请求处理流程(讲的很清楚)
http协议分析报告实例
http请求响应过程
HTTP请求报文格式
1、HTTP协议分析
有关http请求返回值的说明
网络协议实验三wireshark分析http
HTTP协议报头信息详解
HTTP客户端的设计与实现