一直对http的headers不是特别清楚,推荐两篇博客。
个人感觉headers的主要作用就是传递通信中客户端浏览器,请求页面,服务器的相关的信息,同时可以对传递的内容进行格式的约束和合法性的判断。一些数据服务也用headers来做授权验证。
比如apicloud提供了数据云服务,可以通过rest api访问数据库,如果需要查询某个应用的数据库的话,就需要将应用id和key值以及一个数字用sha1加密,存储在headers的某一名字中,然后再发起http请求,服务器在验证headers中该名字的值是否合法,验证合法过后返回查询结果。
Apache有两个http的jar包,httpcomponent这个包里的httpclient不同于commons里的httpclient是一个可实例的类,Httpcomponents中的httpclient(org.apahce.http.client.HttpClient)是一个接口,CloseableHttpClient是继承了这个接口的抽象类,因此要使用httpclient有两种方法。
一种是继承httpclient这个接口,另一种就是使用提供的工厂类,工厂类可以更灵活的获取抽象类的实例,而HttpClients就是一个这样的一个类,它里面有很多静态方法实现抽象类CloseableHttpClient的实例。
HttpClient client = HttpClients.createDefault(); HttpClient client = HttpClients.createMinimal();
提供的method(GET,POST,HEAD)都可以调用addheader或者setheader的方法来添加header。这两个函数的不同点在于:
addHeader,如果同名header已存在,则追加至原同名header后面;setHeader,如果同名header已存在,则覆盖一个同名header。
同名Header可以有多个值,但是运行时使用的是第一个值(这个不太清楚,还需要多测试几次)。
HttpGet get = new HttpGet("https://d.apicloud.com/mcm/api/user/"); get.addHeader("X-APICloud-AppId",appid); get.setHeader("X-APICloud-AppId",appid);