前言

单纯的copy代码没有用,本篇从http请求的基本原理开始为大家讲解,后边有实例,希望大家一步一步看完,这样无论编写什么请求我们都可以得心应手。

HTTP的组成

http消息由客户端到服务端的请求以及服务端到客户端的响应组成

HTTP请求报文的格式

请求头与请求正文中间有一行空行,是告诉服务器请求头到此结束了接下来是请求正文

请求方法:get,post,head,delete等等,告诉服务器你的具体操作是什么

URL:可以从互联网上得到资源的位置和访问方法的一种简洁标识。URL结构:协议://域名 or IP地址:端口号/目录/文件名.文件名后缀?参数=值
协议版本:目前几乎用的都是http1.1版本,增加了一个很重要的特性它支持长连接,其他具体细微差别不做讲述。
请求头:请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
常用的请求头包括:
请求正文:添加请求实体即你具体要请求的内容用于POST请求,GET不用

HTTP响应报文格式

HTTP状态码

HTTP响应头

解析

通过上述分析,我们可以发现HTTP请求其实像发送邮件一样,我们告诉邮局地址,邮局发送邮件,请求头是我们附加的一些信息,可以告诉收件人,谁发的邮件,谁可以看

,这是一封加密的邮件,你要根据什么规则把这封邮件翻译过来等等规则,请求内容当然就是我们要发送的具体内容,响应就是收件人给我的回信,响应头会告诉我们一些附加信息比如他告诉我们,你发送的那个收件人没有(404)或者我正确收到了你的来信(200),我给你的响应是什么加密方式,你要怎么解码,响应内容就是他要告诉我们的具体内容,你也可以把邮局当做一个代理,收件人当做服务器。

实战

接下来,我们根据以上规则使用JAVA来构造一些请求

POST不带请求实体请求方法

import org.apache.http.HttpEntity;
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.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class TestHttp{
    public void postOne(){
     HttpClient client = new DefaultHttpClient();
        HttpResponse response = null;
        String url = "http://write.blog.csdn.net/postedit";
        HttpPost post = new HttpPost(url);
        post.setHeader("Content-Type", "application/json");
        response = client.execute(post);
        String  ret      = EntityUtils.toString(response.getEntity(),"UTF-8");
        System.out.println(ret);
}
}

解析:

1,首先我们要构造一个客户端,apache对HttpClient这个类的解释是该接口仅表示HTTP请求执行的最基本合同,它不会对请求执行过程施加任何限制或具体细节,并且将状态管理,身份验证和重定向处理的细节留给个别实现。具体意思就是我们要发送HTTP请求就要先构造这个HTTPClient,但是涉及一些具体的细节比如cookies,header,request   body我们不需要用它来实现,这些具体的细节我们留给其他类来实现,
2,我们构造一个请求地址,即我们要把这个请求发送给谁
3,构建Post请求,HttpPost有一个构造器HttpPost(String uri) ,我们用这个构造器来初始化HttpPost
4,添加header,HttpPost里有一个setheader和addheader方法,这些方法是它继承接口org.apache.http.HttpMessage得来的,这里说一下add和set的区别,首先同名header
可以有多个,运行时使用第一个,当我们使用addheader时,如果同名header已经存在它会追加至原同名header后面,使用setheader时,他会覆盖同名的header,我在header
中设定了我要发送的请求体是json形式的(实际上并未携带请求体,携带请求体的会在下边给例子)
5,当我们构造好客户端,请求header,url地址后,此时就可以发送了,自然就是client.execute即执行这个请求
6,接下来是接受响应,即我们发送完邮件后,别人给我们回信了,我们要设法获得这个回信的内容即HttpResponse response = client.execute(post) 来关联我们的请求和响应,意思就是这个响应是我执行这个请求的响应getEntity是这个类自带的方法,用来获取响应实体,即具体的响应内容,它还有很多方法,获取响应信息,感兴趣可以自行研究
7,EntityUtils这个类主要是用来处理HttpEntity的,它有一些静态方法,我用的就是将这个响应实体以UTF-8的编码格式转换成字符串,最后打印出来

具体响应

<html><head><title>Object moved</title></head><body><h2>Object moved to <a href="https://passport.csdn.net/account/login?from=http%3a%2f%2fwrite.blog.csdn.net%2fpostedit">here</a>.</h2></body></html>
解析:
还有一些其他的内容,不在这里粘贴,返回的html代码是一个重新登录的地址链接,点击以后告诉我们重新登录,因为我访问的url是csdn的编辑页,不登录怎么可能直接访问呢,我们可以尝试使用cookie这里告诉大家一个进阶技巧,我们打开浏览器,启用开发者模式,然后重新登录一次,找到csdnbi这个接口,然后获取requestheader中的cookies
具体如图:

在这里找到cookie后我们使用post.setheader("Cookie","*****")就可越过登录,直接请求到这个页面了。感兴趣的可以试一下。

具体响应

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>    <script type="text/javascript" src="//static-blog.csdn.net/scripts/tingyun-rum.js"></script><title>编辑文章 - CSDN博客</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <link type="text/css" rel="Stylesheet" href="http://c.csdnimg.cn/pig/blog/write/css/main.css" />    <!--new top-->        <link rel="stylesheet" href="http://c.csdnimg.cn/public/common/toolbar/css/index.css">     <!--new top-->       <script type="text/javascript" src="//static-blog.csdn.net/scripts/jquery.js"></script>    <script type="text/javascript" src="//static-blog.csdn.net/scripts/jquery-version.js"></script><script type="text/javascript" src="//static-blog.csdn.net/scripts/csdn.js"></script><script type="text/javascript" src="http://c.csdnimg.cn/pig/blog/write/scripts/master.js"></script>        <script type="text/javascript">var statichost = "//static-blog.csdn.net";</script>               <link type='text/css' rel='Stylesheet' href='http://c.csdnimg.cn/pig/blog/write/css/write.css' /><script type='text/javascript' src='http://c.csdnimg.cn/pig/blog/write/scripts/jquery.autocomplete.min.js'></script> <script type='text/javascript' src='//static-blog.csdn.net/xheditor/xheditor-1.1.13-zh-cn.js'></script><link type='text/css' rel='Stylesheet' href='http://c.csdnimg.cn/pig/blog/write/css/jquery.autocomplete.css' /></head><body></body></html>
body里包含我的个人信息在这里就不给大家展示了

POST带请求参数和请求实体

前言:如果我们前边的都掌握了,那么接下来的就很容易理解了,我们知道post请求时会携带一些参数比如 http://www.123.com/index.html?a=123还有一些我们要发送的报文
其实参数和报文的处理方式是一样的,那么我们只要构造这个请求实体不就可以了吗?
       List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>();nvps.add(new BasicNameValuePair("baowen","UTF-8"));post.setEntity(new UrlEncodedFormEntity(nvps,"UTF-8"));


解析:

1,我们加入BasicNameValuePair,这个类是干嘛用的呢,apache的官方解释是用作HTTP消息元素的名称 - 值对参数。我们就用它来构造参数
2,我为什么用list,因为有时你的参数可能不止一个,这是它的一个构造器BasicNameValuePair(String name, String value) ,报文一定要是字符串格式,UrlEncodedForm
Entity(List<? extends NameValuePair> parameters, String charset) 我要用这个类来构造实体就必须使用list来添加参数,同时这个类实际上是继承StringEntity,它又实现了
HttpEntity这个接口,知道这一点很重要。
3,public void setEntity(HttpEntity entity)这个方法要传入一个HttpEntity类型的参数,所以后边我可以直接用。

GET不带参数请求

       HttpGet get = new HttpGet(url);get.setHeader("Content-Type", "application/json");HttpResponse rese = client.execute(get);String redsa = EntityUtils.toString(rese.getEntity());

GET携带参数请求

        CloseableHttpClient client3 = HttpClients.createDefault();List<NameValuePair> nvps2 = new ArrayList<NameValuePair>();nvps2.add(new BasicNameValuePair("baowen","213"));HttpResponse resep = null;URIBuilder builder = new URIBuilder(url);builder.setParameters(nvps2);HttpGet get21312 = new HttpGet(builder.build());response = client.execute(get21312);String sdf = EntityUtils.toString(response.getEntity(),"UTF-8");

注意

1,后边的代码我没有写完整,我们需要根据自己的需求添加URL
2,header里我用的都是json,大家可以根据自己需要什么类型做改变

3,我将返回都转换成了字符串,方便打印

4,我这里使用的是apache的http包,关于网络编程,JAVA也有自带的java.net包

总结

通过上边的学习我们明白,只要我们掌握了http请求由什么组成,哪些类来构造这些东西,然后在解析响应剩下的就对我们来说很简单了。万变不离其宗,这次我发这个总结主要是由于之前发的一遍http 发送 post请求 的贴访问量很高,感觉有必要指引一下新入坑的同学们,当然我自己也在学习之中,欢迎大家留言,咱们互相探讨,共同进步

HTTP请求详解含POST,GET实例相关推荐

  1. 如何用ajax做登录页面,ajax如何制作登录页面?登录页面ajax的请求详解(附完整实例)...

    本篇文章主要的讲述了关于ajax登录页面时ajax请求的内容,现在我们一起来看看这篇文章吧 登录页面ajax请求 一.登录验证提示信息//提交登录信息sub.on('click',function(e ...

  2. jQuery数组处理详解(含实例演示)

    jQuery的数组处理,便捷,功能齐全. 最近的项目中用到的比较多,深感实用,一步到位的封装了很多原生js数组不能企及的功能. 最近时间紧迫,今天抽了些时间回过头来看 jQuery中文文档 中对数组的 ...

  3. fetch 请求详解

    转载:前后端数据交互(四)--fetch 请求详解 - 前端人 - 博客园 fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同 ...

  4. JavaEE基础(03):Http请求详解,握手挥手流程简介

    本文源码:GitHub·点这里 || GitEE·点这里 一.Http协议简介 1.概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传 ...

  5. php xml 实例教程,php解析xml方法实例详解,解析xml实例详解_PHP教程

    php解析xml方法实例详解,解析xml实例详解 本文以实例形式详细讲述了php解析xml方法.分享给大家供大家参考.具体分析如下: books.xml文件如下: Harry Potter J K. ...

  6. java web流量阀值_Javaweb应用使用限流处理大量的并发请求详解

    在web应用中,同一时间有大量的客户端请求同时发送到服务器,例如抢购.秒杀等.这个时候如何避免将大量的请求同时发送到业务系统. 第一种方法:在容器中配置最大请求数,如果大于改请求数,则客户端阻塞.该方 ...

  7. Zabbix+MatrixDB大规模监控与分析解决方案详解(含PPT)

    首先,谢谢原作者:(此文为转载的文章,现将原地址贴出如下:以下文章来源于yMatrix,作者MatrixDB团队Zabbix+MatrixDB大规模监控与分析解决方案详解(含PPT)) 更多精彩Zab ...

  8. android dialog 详解,详解android dialog自定义实例

    现在很多应用程序的提示对话框都很有个性的,如果你使用的对话框样子还是传统的对话框,是不是有点LOST了呢?今天爱站技术频道小编就给大家讲讲详解android dialog自定义实例. 第一个需求:简单 ...

  9. mysql like escape_mysql like语句用法详解 含通配符使用方法

    mysql like语句用法详解 含通配符使用方法2017-11-07 20:46 在对数据进行模糊查询的时候,我们基本上都会用到like语句. 我们先来了解一下like语句中的通配符:百分号(%). ...

最新文章

  1. 2字节十六进制浮点数 qt_Qt中如何实现十六进制“41A4 0000”十六进制转为浮点数20.5呢?...
  2. Nodejs in Visual Studio Code 03.学习Express
  3. 专家:四大问答指出混合云的应用之路
  4. ModuleNotFoundError: No module named 'djqscsv'
  5. 关于crossvalind函数(转)
  6. 通信维修专用电源_万可PRO 2电源 | 开拓性通信功能,自信迈入数字化时代
  7. cad抠图 lisp_用Autolisp对AutoCAD进行二次改造
  8. linux下rpm包安装MySQL
  9. 九大背包问题专题--有依赖的背包问题(树形Dp结合)
  10. ffmpeg+h264_nvenc+vs2019配置编译
  11. 2022年5月8日 解决手机连接电脑无法选择“传输文件”
  12. 火星开发的价值_开发火星是幌子,月球才是必争之地
  13. 微型计算机48MHz辐射超,造成EMC辐射超标原因有哪些(精彩案例分析)
  14. Anaconda和pycharm
  15. Vulnhub靶机:EVILBOX_ ONE(很详细)
  16. 第十四章 习题14-11-习题14-20
  17. 小程序毕设作品之微信校园浴室预约小程序毕业设计成品(3)后台功能
  18. PHP程序设计基础教程pdf
  19. UML中常用的几种图
  20. 停车场计费算法 php,《算法与数据结构》课程设计之停车场的收费管理系统

热门文章

  1. 2020超新Dubbo的简单使用(保姆级)
  2. IE浏览器兼容性设置
  3. java 图片上写字_java 在图片上写字,两个图片合并的实现方法
  4. YHL--------------------------------------------------人生路规划
  5. 如何为Joomla主流模板添加统计代码
  6. 实训10 异常、API、list
  7. 三星s4i9500+android4.2.2基带,三星i9500/Galaxy S4 刷基带教程指引
  8. 巴菲特看好苹果的未来,然而库克似乎不太乐观选择抛售股份
  9. ios计算个税方法以及ui界面设计代码详解
  10. 在CSGO中大家都知道VAC封禁 那么你知道OW的意思吗?