HTTP请求详解含POST,GET实例

前言

单纯的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不带请求实体请求方法

 
  1. import org.apache.http.HttpEntity;

  2. import org.apache.http.HttpResponse;

  3. import org.apache.http.NameValuePair;

  4. import org.apache.http.client.ClientProtocolException;

  5. import org.apache.http.client.HttpClient;

  6. import org.apache.http.client.entity.UrlEncodedFormEntity;

  7. import org.apache.http.client.methods.HttpGet;

  8. import org.apache.http.client.methods.HttpPost;

  9. import org.apache.http.client.utils.URIBuilder;

  10. import org.apache.http.entity.ContentType;

  11. import org.apache.http.entity.StringEntity;

  12. import org.apache.http.impl.client.CloseableHttpClient;

  13. import org.apache.http.impl.client.DefaultHttpClient;

  14. import org.apache.http.impl.client.HttpClients;

  15. import org.apache.http.message.BasicNameValuePair;

  16. import org.apache.http.util.EntityUtils;

public class TestHttp{
	public void postOne(){
 
  1. HttpClient client = new DefaultHttpClient();

  2. HttpResponse response = null;

  3. String url = "http://write.blog.csdn.net/postedit";

  4. HttpPost post = new HttpPost(url);

  5. post.setHeader("Content-Type", "application/json");

  6. response = client.execute(post);

  7. String ret      = EntityUtils.toString(response.getEntity(),"UTF-8");

  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不带参数请求

 
  1. HttpGet get = new HttpGet(url);

  2. get.setHeader("Content-Type", "application/json");

  3. HttpResponse rese = client.execute(get);

  4. String redsa = EntityUtils.toString(rese.getEntity());

 

GET携带参数请求

 
  1. CloseableHttpClient client3 = HttpClients.createDefault();

  2. List<NameValuePair> nvps2 = new ArrayList<NameValuePair>();

  3. nvps2.add(new BasicNameValuePair("baowen","213"));

  4. HttpResponse resep = null;

  5. URIBuilder builder = new URIBuilder(url);

  6. builder.setParameters(nvps2);

  7. HttpGet get21312 = new HttpGet(builder.build());

  8. response = client.execute(get21312);

  9. String sdf = EntityUtils.toString(response.getEntity(),"UTF-8");

注意

1,后边的代码我没有写完整,我们需要根据自己的需求添加URL

2,header里我用的都是json,大家可以根据自己需要什么类型做改变

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

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

总结

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值