HTTP get和post请求过程中常用的方法
1.建立连接的过程

CloseableHttpClient httpClient = HttpClients.createDefault();

CloseableHttpClient类型的,和下面的CloseableHttpResponse是亲兄弟啊!
此时只是建立连接,三次握手,并没有传地址。
2.定义一个get或者post请求

httpGet =new HttpGet(getUrl);//get请求
httpPost = new HttpPost(url);//post请求

这里已经定义了URL
3.构建消息头

httpGet.setHeader("Content-type", "application/json");

get请求重新设置参数 java get请求步骤_get请求重新设置参数 java


其中header中可以包含很多内容,如:content-type,auth,cookie,user-agent等等。我现在还在纠结,发送http请求的时候调用setheader方法去设置header,到底需要哪些请求头字段,是全部需要?还是需要一部分?按照规范应该是根据接口文档中规定的设置,但是如果多设置了一个接口文档中没有的字段,会发生什么情况?想了一天,终于想明白一些事情!

(1)、我们应该严格按照接口文档来进行接口测试,接口文档中规定了接口的请求头和请求体,所以拿到接口文档的时候一定要仔细研读。

(2)、有一部分headers是默认设置的,如果不传也会有默认值,并不影响请求效果。

(3)、可以自己设置一些接口文档中没有要求的headers,但是我测试了一个接口,其中request headers“accpet-encoding:gizp,deflate,br”这个是默认的,我在请求中另外添加了这个headers:“accpet-encoding”.将其赋值为“accpet-encoding:gizp”,也是可以发送成功的。但是当我赋值为“accpet-encoding:xxx”,就会发送失败,如果自己想定义,就一定要定义正确,但是问过老师之后,老师说可以这样理解,但是老师说有一些字段就算传错了,也不会有问题。所以综上所述,按时要按照接口文档来进行测试。

4.post请求比get请求多了一个请求体,装数据用的。

String bodyString = JSON.toJSONString(requestModel);//requestModel是实例化一个自己定义的LoginRequestModel类的对象,通过setter方式进行赋值,所以requestModel是一个json形式的对象,这里是将json转为了String类型。
httpPost.setEntity(new StringEntity(bodyString));//这里的setEntity才是重点。而且参数并不是单纯的String类型,还需要将String类型的bodyString转换成StringEntity

HTTP请求报文格式就如下图所示

get请求重新设置参数 java get请求步骤_接口文档_02


在这里插入图片描述

Http相应报文同样也由三个部分组层:响应行、响应头、响应体

响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK

5.执行请求,获取响应

CloseableHttpResponse response = httpClient.execute(httpGet);//httpGet或者是httpPost的请求

得到了一个CloseableHttpResponse类型的response
6.将得到的response转换成entity形式

HttpEntity httpEntity = response.getEntity();

7.然后再对httpEntity进行其他操作,如转成String形式输出

String responseBody = EntityUtils.toString(httpEntity,"utf-8");

8.再转成json对象类型

JSONObject jsonObject = JSONObject.parseObject(responseBody);

对json对象通过key-value的方式进行get等操作
综合5.6.7.8

CloseableHttpResponse response = httpClient.execute(httpGet);//httpGet或者是httpPost的请求
HttpEntity httpEntity = response.getEntity();
String responseBody = EntityUtils.toString(httpEntity,"utf-8");
JSONObject jsonObject = JSONObject.parseObject(responseBody);

System.out.println("response");
System.out.println("httpEntity");
System.out.println("responseBody");

控制台打印出来这三个的时候,发现问题了。
response已经是返回的响应了,为什么打印response的时候没有body?需要通过getEntity之后才可以获得body?
原来response是一个CloseableHttpResponse的实体,实体里面保存的是一种可以按照地址来理解的一个东西,是一个CloseableHttpResponse类型,而返回的数据body是一个String(Json)类型,所以只能通过getEntity,然后调用HttpEntity 里面toString的方法转成String类型。