超文本传输协议http:
http是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器是网站,通过http或者https协议请求的资源由统一资源标示符来标识。
GET方法取回由Request-UR标志的信息,HEAD方法也是取回由Request-URL标识的信息,只是在响应时,不返回消息体。POST方法可以请求服务器接受包含在请求中的实体信息,可以用于提交表单,向新闻组和数据库发送消息。
一、
URL:统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址,互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎样去处理它。
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”,完整的、带有授权部分的普通统一资源标识符语法如下:
协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
第一部分:协议/模式:他告诉浏览器如何处理将要打开的文件,常用http
第二部分:文件所在的服务器的名称或ip地址,后面是到达这个文件的路径和文件本身的名称,服务器的名称或IP地址后面有时还跟一个冒号和一个端口号。它也可以包含接触服务器必须的用户名称和密码。路径部分包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔。询问部分一般用来传送对服务器上的数据库进行动态询问时所需要的参数。
有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,URL引用路径中最后一个目录中的默认文件(通常对应于主页),这个文件常常被称为 index.html 或 default.htm。
二、
http请求报文和http响应报文
http请求报文由请求行、请求头部、空行和请求数据4部分组成
or
<request-line>
<headers>
<blank line>
[<request-body>
1.请求行:如GET/index.html HTTP/1.1
2.请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号分隔
3.空行,发送回车符和换行符,通知服务器一下不再有请求头
4.请求数据在post方法中使用,与请求数据相关的最长使用的请求头是Content-Type和Content-Length
三、
http中GET和POST的区别:
1.get一般用于获取、查询资源信息,post一般用于更新资源信息
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,参数之间以&相连,如login.action?name=hyddd&password=idotknow&vertify=%E4%BD%Ao%E5%BD,如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,其中%xx表示16进制下的ASCII
post把提交的数据放置在HTTP包的包体<request-body>中
get提交的数据会在地址栏中显示出来,而post提交,地址栏不会改变
2.传输数据的大小:
HTTP协议没有对传输的数据的大小进行限制,HTTP协议规范也没有对URL长度进行限制,而在实际开发中存在的限制主要有:
GET:特定浏览器和服务器对URL长度有限制
POST:由于不是通过URL船只,理论上数据不受限。
3.安全性:
POST的安全性要比GET的安全性高,通过GET提交数据,用户名和密码讲明文献是在URL上,因为(1)登陆页面有可能被浏览器缓存,(2)其他人查看浏览器的历史记录即可得到密码
四、网址结构
网址有两个或两个以上的词构成,中间由点号分开,最右边为顶级域名,如.com(表示工商企业),.net(网络提供商)
HTTP协议详解之响应篇
在接收和解释请求消息后,服务器返回一个HTTP响应消息。
Http响应式有三部分组成,分别是:状态航、消息报头、响应正文
1、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发挥的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了相应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的URL
500 Internet Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
五、检查网络连接状态
添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
//判断是否有网络连接 public boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null) { return info.isAvailable(); } } return false; }
//判断WIFI网络是否可用 public boolean isWifiConnected(Context context){ if (context!=null){ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (info!=null){ return info.isAvailable(); } } return false; }
//判断Mobile网络是否可用 public boolean isMobileConnected(Context context) { if (context != null) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (info != null) { return info.isAvailable(); } } return false; }
//判断当前网络连接类型信息 public static int getConnectedType(Context context) { if (context != null) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null && info.isAvailable()) { return info.getType(); } } return -1; }
添加一张网络图片到手机上
添加权限:
<uses-permission android:name="android.permission.INTERNET" />
public class MainActivity extends Activity { private TextView tv; private ImageView img; private final MyHandler handler = new MyHandler(this); Bitmap bitmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img = (ImageView) findViewById(R.id.img); tv = (TextView) findViewById(R.id.tv); } //使用Handler更新UI public static class MyHandler extends Handler { private final WeakReference<MainActivity> weak; public MyHandler(MainActivity mainActivity) { weak = new WeakReference<MainActivity>(mainActivity); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); MainActivity activity = weak.get(); if (activity != null) { switch (msg.what) { case 1: activity.img.setImageBitmap((Bitmap) msg.obj); break; default: break; } } } } public void showImg(View view) { new Thread(new Runnable() { @Override public void run() { try { URL url = new URL("http://img1.xiazaizhijia.com/walls/20150721/1440x900_5d8830739233940.jpg"); InputStream in = url.openStream(); bitmap = BitmapFactory.decodeStream(in); Message msg = handler.obtainMessage(1, bitmap); handler.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }