1. HTTP请求的组成内容
客户端发送的消息,分为三部分:消息行、消息头、消息头
- 消息行:提交数据的方式(GET/POST)、访问资源 、使用的HTTP协议版本
- 消息头:描述客户端或者发送内容的属性,用来给服务端进行解析,以键值对的方式保存信息,比如主机名、内容类型、内容长度等。
- 消息体:可添加的其它数据,比如POST方式向服务端提供的数据会存放在这里。
服务端返回的消息,也分为三部分:应答行、应答头、应答体
- 应答行:使用的HTTP协议版本 / 状态码(数值形式,表示请求资源的情况,比如404(NOT FOUND)表示请求的资源不存在,而200(OK)表示正常)
- 应答头:基本与消息头类似,只是返回的描述属性有差异,比如应答头中有资源最后修改的时间(Last-Modified)等
- 应答体:服务器可添加的其它数据,你可以把应答体和应答头看作是规定格式的,而应答体的内容是可以由服务端自己定义。
2. HTTP提交数据的方式:GET和POST的区别?
从结果来说,以GET方式提交数据,比如向服务端提交用户名和密码(规定以name1=value1&name2=value2),它会把数据以明文的形式追加到URL后面(前面添加一个“?“,以便于服务端解析),即游览器中地址栏后面。而POST则会把数据存放在消息体中。GET的方式向服务端提交自定义数据安全行存在隐患,所以如果想服务端获取数据一般以GET方式,而提交数据则以POST方式。
3. 如果没有浏览器这种客户端,怎么通过Java API来实现HTTP请求?
首先创建一个URL对象,称为资源定位符,它一般有协议、主机、端口、资源四部分组成,其实就是我们所说网址的形式,比如http://www.google.com/search。然后通过openConnection()方法返回一个HttpURLConnection对象,然后通过SetRequestMethod(String method)来设置GET或者POST提交方式,接着设置一些常用属性,比如:
- setConnectTimeout(int timeout),连接超时(毫秒)。
- setReadTimeout(int timeout),读取超时。
- setRequestProperty(String key,String value),设置消息头。
然后,如果是POST方式提交自定义数据,则首先通过getOutputStream()返回OutputStream流,并向IO流中写入数据(数据形式:name1=value1&name2=value2,多组数据以&连接,可以视作规定。以便于服务器以比较统一的方式解析);如果只需获取数据,则不需要上面的步骤,直接以getInputStream()方法返回InputStream流,然后通过IO流的读数据的方式来返回数据。
- getOutputStream()
- getInputStream()
最后通过disconnect()方法来关闭连接 - disconnect()