HTTP协议

HTTP是基于TCP处于应用层的一种协议,与传输层协议不同,它关注的不是像TCP那样的可靠传输,而是站在应用的角度,对传输的信息来具体的使用。HTTP广泛应用于手机APP和浏览器之中。

HTTP的请求和响应

HTTP的请求格式:由Requset Header(请求头) 和Requset Body(请求体)两部分组成。

请求头: 除了第一行是 请求方法 路径HTTP版本 如上图所示  POST /login HTTP/1.1表示使用POST请求,路径是 / ,版本是HTTP/1.1。之后的每一行都是以Header:Value为格式的键值对,我们称这些内容为请求头;

请求体: 它将一个页面表单中的组件值通过param1=value1 param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/Demo/index.html? param1=value1param2=value2”的方式传递请求参数。

HTTP的响应格式:由Response Header(请求头) 和 Response Body(请求体)两部分组成。

响应头: 除了第一行是 HTTP版本 响应代码 响应说明,如上图所示 HTTP/1.1 200 OK 表示版本为HTTP/1.1,响应代码是200,响应说明是OK。之后的每一行都是以Header:Value为格式的键值对,我们称这些内容为响应头;

响应体:即我们所需要的内容。

HTTP的响应状态码由5段组成

1xx :表示一个提示性响应,例如101表示将切换协议,常见于WebSocket连接;
2xx :表示一个成功的响应,例如200表示成功,206表示只发送了部分内容;
3xx :表示一个重定向的响应,例如301表示永久重定向,303表示客户端应该按指定路径重新发送请求;
4xx :表示一个因客户端问题导致的错误响应,例如404表示指定的路径不存在;
5xx :表示一个因为服务器问题导致的错误响应,例如500表示服务器内部故障,503表示服务暂时无法响应;

HTTP编程

因为浏览器也是一种HTTP客户端,所以,客户端的HTTP编程,它的行为本质上和浏览器是一样的,即发送一个HTTP请求,接收服务器响应后,获得响应内容。只不过浏览器进一步把响应内容解析后渲染并展示给了用户,而我们使用Java进行HTTP客户端编程仅限于获得响应内容。下面我们以在网页上爬取一个图片为例:

1.首先通过资源定位符(URL)打开这张图片的地址。

2.通过HttpURLConnection打开对URL的连接。

3.设置请求方式,Header属性,为了让服务器不拒绝我们的访问,我们设置User-Agent属性为“Mozilla/5.0 (Windows NT 10.0; Win32; x32) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36“,模拟用户进行对服务器的访问。

4.当我们请求成功后便可以通过输入流读取该图片,通过输出流写到我们的本次磁盘上。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;public class DataFetch {public static void main(String[] args) {try {//某张电影海报的图片(该图片的统一资源定位符)URL imageUrl = new URL("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2875247130.webp");//打开连接HttpURLConnection connection  = (HttpURLConnection)imageUrl.openConnection();//设置请求方式GETconnection.setRequestMethod("GET");;//设置请求Header属性connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win32; x32) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");//读取图片//存储图片(写入图片的字节内容)try(BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\HTTP\\douban\\海报.jpg"));){//边度边写byte[] buf = new byte[1024];int len = -1;while((len = bis.read(buf))!=-1) {bos.write(buf, 0, len);}}}catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

网络编程-HTTP编程相关推荐

  1. 软件工程网络15结对编程作业

    软件工程网络15结对编程作业 1.项目成员 学号:201521123014 博客地址:http://www.cnblogs.com/huangsh/ 学号: 201521123102 博客地址:htt ...

  2. 推荐一本书《网络机器人java编程指南》

    如果对搜索引擎感兴趣,推荐给大家一本书,Jeff Heaton的<网络机器人java编程指南>.中文版,E文不好的这下不用头痛了.有需要的,可以留言给我. Jeff Heaton is a ...

  3. 转:java网络编程-HTTP编程

    转自: java网络编程-HTTP编程_Stillsings的博客-CSDN博客HTTP编程Java HTTP编程支持模拟成浏览器的方式去访问网页URL, Uniform Resource Locat ...

  4. java的网络功能与编程_Java的网络功能与编程(转载)

    Java的 网络 功能与编程 徐迎晓 (上海大学计算中心25#) 摘  要:Java语言是Internet上最热门的编程语言,本文针对 Java的 网络 功能,对Java从 网络 上获取图象.声音. ...

  5. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

    菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...

  6. note-PythonCookbook-第十一章 网络与WEB编程

    第十一章 网络与WEB编程 11.1 作为客户端与HTTP服务交互 requests模块 11.2 创建 TCP 服务器 简单的应答服务器 from socketserver import BaseR ...

  7. 初探数通网络开放可编程简介

    文章目录 网络运维面困难与挑战 行业趋势 面临困难 数通网络可开放编程简介 应用场景 多厂商设备快速适配 新业务快 网络变更可靠 管控析全栈可编程 特性介绍 动态加载软件包 事务机制 数据一致性 用户 ...

  8. Java网络编程——Socket 编程

    Socket 编程 Socket编程是在TCP/IP上的网络编程,但是Socket在上述模型的什么位置呢.这个位置被一个天才的理论家或者是抽象的计算机大神提出并且安排出来 我们可以发现Socket就在 ...

  9. C语言笔记(27)网络编程-TCP编程

    CS模式 有个服务器, 有个客户端, 会经过一些函数 linux下,所有的操作都是对文件进行操作,而对文件的操作是利用文件描述符(file descriptor)来实现的.每个文件进程控制块中都有一份 ...

  10. 网络分流器-网络分流器-多核编程的几个难题及其应对策略

    网络分流器-网络分流器-多核编程的几个难题及其应对策略! 戎腾网络: 随着多核CPU的出世,多核编程方面的问题将摆上了程序员的日程,有许多老的程序员以为早就有多CPU的机器,业界在多CPU机器上的编程 ...

最新文章

  1. 最长回文子串--马拉车(?)
  2. 2、mybatis主配置文件之properties
  3. 无网情况下linux安装django
  4. 调用cmd不显示黑框的方法
  5. leetcode111. 二叉树的最小深度(队列)
  6. Forrester云原生开发者洞察白皮书,低代码概念缔造者又提出新的开发范式
  7. Android 系统(61)---LCD 屏幕分辨率
  8. 近千人点赞!哈佛博士放出超多资源,机器学习课程教程小抄全都有
  9. E9表单按钮置灰功能与单元格自定义属性说明
  10. 蓝桥杯2020年第十一届C/C++省赛B组第二题-既约分数
  11. 【渝粤教育】国家开放大学2018年春季 0043-21T计算机文化 参考试题
  12. 网易开源云原生日志系统!
  13. python构造icmp数据包_python – 在scapy中发送ICMP数据包并选择正确的接口
  14. js:获取年龄的函数
  15. 关于将Tesorflow的SavedModel模型转换成tflite模型
  16. 一文搞懂基因融合(gene fusion)的定义、产生机制及鉴定方法
  17. oracle的dmp文件导入mysql_Oracle 数据库导入导出 dmp文件
  18. Faster-RCNN的关键点总结
  19. 支付回答——如何理解借记和贷记
  20. 【IOS】《捕鱼达人》的简单实现(一)

热门文章

  1. php对接京东宙斯平台,利用京东联盟API获取自定义推广链接
  2. 二进制换算十进制、八进制和十六进制。
  3. Qt 实现Unicode字符表情包显示到界面 Emoji
  4. android手机如何截屏,安卓手机怎么截图? (全文)
  5. 2022年全球市场燃油液位传感器总体规模、主要生产商、主要地区、产品和应用细分研究报告
  6. 【华为云技术分享】深度理解AI概念、算法及如何进行AI项目开发
  7. deepin linux live cd,Deepin Live cd修复引导
  8. 点击 按钮 下载图片
  9. 南航里程每年清空吗_年末提醒| 除了换机票,那些即将清零的航空里程还有什么用...
  10. 上海黄金交易所交易操作基本知识