最近在项目中,一直在使用HttpClient 中的方法,这里我进行一些方法的汇总,也是结合了一些大牛写的代码,以备不时之需

  官话:HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议

      在我的博客我的常用工具了中有关于httpclient 的常用方法,在平常的开发中是足够用了----------在这里我细致的总结一下

  1.我们在使用httpclient 第一步就是创建CloseableHttpClient 实例,这也是官方推荐方法:

 CloseableHttpClient httpclient = HttpClients.createDefault()

  2.创建 httpget 与 httppost 的实例,我们进行网络连接的关键步骤:

//post 请求
HttpPost httppost =new HttpPost(url);
// get请求
HttpGet httpget =new HttpGet(url);

  3. addHeader(arg0, arg1)  :见名知意,可以为我们请求加上请求头,cookie

//加cookie 头

httppost.addHeader("Cookie","JSESSIONID=fnwebidwn==");

//User-Agent

httppost.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");

......

  4.   httppost.setEntity(entity); 放入需要传递的参数,只出现在post 方法中,因为get直接在地址后面追加参数。

   httppost 我们常用三种都是需要我们掌握的

        1.传递json 类型的字符串

        2.传递form表单

        3.Multipart/form-data 类型 的数据

    (1),第一个比较简单,就是将我们的json参数转换为字符串进行传递,这个不多讲,使用过微信接口就应该不会陌生,很简单的

// outstr 是json字符串类型的参数,
httppost.setEntity(new StringEntity(outstr, "UTF-8"));

    (2),第二种传递form 表单,类似于我们form 表单提交的POST 请求,将参数进行了封装,使用时候必须将参数封装

                    ArrayList<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>(); 中

    
//在集合中放入我们表单中的name --- value 键值对

List<BasicNameValuePair> pair =new ArrayList<BasicNameValuePair>();
pair.add(new BasicNameValuePair("name", "value"));
pair.add(new BasicNameValuePair("name2", "value2"));
pair.add(new BasicNameValuePair("name3", "value3")); //-------工作中一般将参数封装在Map中,我们遍历Map往 BasicNameValuePair 集合中放入 List<BasicNameValuePair> pair =new ArrayList<BasicNameValuePair>();   //我们遍历map 将数据转化为我们的表单数据
for (Map.Entry<String,String> entry:
map.entrySet()) {
pair.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));
} //httppost 中放入我们的经过url编码的表单参数

httppost.setEntity(new UrlEncodedFormEntity(pair));

    (3). 传递Multipart/form-data 类型 的数据,这种数据类型在文件上传中使用的,类似有form 表单设置了 enctype="multipart/form-data",   默认表单是  application/x-www-form-urlencoded

      关于这两个的区别:multipart/form-data ,用于文件的上传,设置表单的MIME编码,二进制传输数据,参数会以boundary进行分割

               application/x-www-form-urlencoded:不能进行文件的上传,我们一般form表单默认就是这个类型

               一般只要不涉及到文件上传,建议还是使用默认 application/x-www-form-urlencoded 我们第二种提交方式 

//创建 MultipartEntityBuilder,以此来构建我们的参数
MultipartEntityBuilder EntityBuilder = MultipartEntityBuilder.create();
//设置字符编码,防止乱码
ContentType contentType=ContentType.create("text/plain",Charset.forName("UTF-8"));
//填充我们的文本内容,这里相当于input 框中的 name 与value
EntityBuilder.addPart("name", new StringBody("value",contentType));
EntityBuilder.addPart("name1", new StringBody("value1",contentType));
EntityBuilder.addPart("name2", new StringBody("value2",contentType));
//上传我们的文件
EntityBuilder.addBinaryBody("filename", new File("C:\\Users\\Administrator\\Desktop\\testImg.png"));
//参数组装
post.setEntity(EntityBuilder.build());

  这样,三种常见的参数提交方式就OK了,亲测可用哦;

  5.参数post.setEntity("entity对象“”)封装好之后,就是进行发送网络请求了 ,返回  HttpResponse  

HttpResponse response=httpclient.execute(post);

  6.接下来就是解析返回来的  HttpResponse ,有很多办法,但是我看到很多大牛写到这里解析 HttpResponse 时候,都会创建一个实现了 ResponseHandler 的处理器,进行 

  自己编码后续的处理;如下: 

package com.project.utils;

import java.io.IOException;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.util.EntityUtils; public class Utf8ResponseHandler implements ResponseHandler<String> { /*
*实现utf-8编码的返回数据类型,实现ttpclient ResponseHandler接口方法
*
*copy from {@link org.apache.http.impl.client.BasicResponseHandler}官方默认提供
*/
public static final ResponseHandler<String> INSTANCE = new Utf8ResponseHandler(); @Override
public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
final StatusLine statusLine = response.getStatusLine();
final HttpEntity entity = response.getEntity();
if (statusLine.getStatusCode() >= 300) {
EntityUtils.consume(entity);
throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
}
return entity == null ? null : EntityUtils.toString(entity, Consts.UTF_8);
} }

  其中:

  

response.getStatusLine().getStatusCode()//可以获得服务的响应码
HttpEntity entity = response.getEntity() //获取响应的对象内容
EntityUtils.toString(entity, Consts.UTF_8) //进行相应内容文本展示并编码
 

  7. 完成之后,释放资源

    

finally {

                httppost.releaseConnection();
}

..........................这就是HttpClient 完整的一套流程

      

Httpclient 表单,json,multipart/form-data 提交 ---总结常用的方法的更多相关文章

  1. Form表单 JSON Content-type解析

    Form表单 JSON Content-type解析 1 表单Form概述 在Form表单中,参数一般有: action 表单提交的url method 提交方式:post get name 表单的属 ...

  2. jquery提交form表单插件jquery.form.js

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对<name&value>格式和JSON格式。

    http://zhengxinlong.iteye.com/blog/848712 将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对<name& ...

  4. [js开源组件开发]query组件,获取url参数和form表单json格式

    query组件,获取url参数和form表单json格式 距离上次的组件[js开源组件开发]ajax分页组件一转眼过去了近二十天,或许我一周一组件的承诺有了质疑声,但其实我一直在做,只是没人看到……, ...

  5. jQuery实现form表单基于ajax无刷新提交方法详解

    本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...

  6. form表单按enter键自动提交的问题

    废话不多说.直接上代码. 1:form表单按enter键自动提交的情况 <!doctype html> <html lang="en"> <head& ...

  7. 详解Ajax请求(三)——jQuery对Ajax的实现及serialize()函数对于表单域控件参数提交的使用技巧

    原生的Ajax对于异步请求的实现并不好用,特别是不同的浏览器对于Ajax的实现并不完全相同,这就意味着你使用原生的Ajax做异步请求要兼顾浏览器的兼容性问题,对于java程序员来讲这是比较头疼的事情, ...

  8. jQuery插件 -- Form表单插件jquery.form.js<转>

    jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxForm() 和 ajaxSubmi ...

  9. Form表单插件jquery.form.js

    常常使用到这个插件,但是老忘记怎么使用,现在对大家写的进行一定的整合. 使用插件实例: 一般的使用方法 <!-- 引入jquery文件 --> <script src="h ...

  10. 9月8日HTML表单元素(form、文本、按钮、选择)

    表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...

随机推荐

  1. Django下的templates 和 static静态文件

    如果Django顶层目录中没有templates的话,就自己新建一个Directory ,这个文件是存放html文件的 1)如果在views里面用render(request,"" ...

  2. C#实现联合体

    [StructLayout(LayoutKind.Explicit, Size = )] public struct TypeTransform { [FieldOffset()] public fl ...

  3. unity脚本执行顺序

    Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->R ...

  4. Hydra密码破译工具

    Hydra简介 Hydra是著名黑客组织thc开发的一款开源的暴力密码破解工具,可以在线破解多种密码,目前已经被Backtrack和kali等渗透平台收录.除了命令行下的Hydra外,还提供了Hydr ...

  5. 遍历DOM树,链式操作

    如果需要在同一个选取结果上使用多个jQuery方法,可以同时列出这些方法,并用.隔开,如下面的代码. 1 $("#one").hide().delay(500).fadeIn(15 ...

  6. python实现Excel删除特定行、拷贝指定行操作

    工作中遇到的,本来用VBA写的,操作很慢,尝试用Python实现, 任务需求: 从原始的两张表中拷贝行到五张表中,如下表所示: source1和source2是一样的格式:         one t ...

  7. 22.struts2-拦截器.md

    目录 1.执行的流程时序图 1.执行的流程时序图 回顾: Struts配置: * 通配符.动态方法调用 * 全局跳转配置.配置的默认值.常量配置 * Struts核心业务 * 请求数据的自动封装 (p ...

  8. 15.Colection集合和Iterator接口.md

    目录 1.Collection 1.1概念 1.1遍历方法-Lambda表达式 1.2遍历方法-Iterator接口 1.3使用Lambda方法遍历Iterator接口 1.4使用Foreach方法遍 ...

  9. Uni2D 入门 -- Atlas转载 http://blog.csdn.net/kakashi8841/article/details/17588095

    转载csdnTexture Atlas 我为什么应该使用Texture Atlas? 使用Atlas是一个普遍的好做法,而且它有很多好处.当有某些需要在屏幕渲染的时候,它背后带来的是draw call ...

  10. 解决:python 连接Oracle 11g 报错:ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

    其次,将查询到的service_name替换sid即可:conn=cx_Oracle.connect('hr/admin@localhost:1521/EE.oracle.docker')