HttpClient使用指南POST请求
可能会用到的相关包import java.io.File; import java.nio.charset.Charset; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils;使用HttpClient发送一个表单POST请求try { CloseableHttpClient client = HttpClients.createDefault(); List paras = new ArrayList(); paras.add(new BasicNameValuePair("testIn1", "表单1")); paras.add(new BasicNameValuePair("testIn2", "true")); paras.add(new BasicNameValuePair("testIn3", "3")); paras.add(new BasicNameValuePair("testIn4", "20210929010101")); paras.add(new BasicNameValuePair("testIn5", "5.1")); HttpUriRequest post = RequestBuilder.post("http://localhost:9092/test.jsp")// .setEntity(new UrlEncodedFormEntity(paras, "GBK"))// .build(); HttpResponse res = client.execute(post); System.out.println(res.getEntity().getContentType().toString()); System.out.println(EntityUtils.toString(res.getEntity())); } catch (Exception e) { e.printStackTrace(); }创建一个请求客户端:HttpClients.createDefault(),用来实际发起调用post请求,可以类比成浏览器。组装表单请求数据:通过ArrayList容器组装NameValuePair类型的请求数据,一个NameValuePair对象里存的是一个键值对。创建一个post请求:通过请求构造器RequestBuilder的post方法构造一个post请求,通过setEntity方法向post请求里放置请求参数,请求参数需要通过UrlEncodedFormEntity对象包装,并指定编码字符集(这里是指对方编码 ),通过addHeader方法向post请求里追加请求头信息,请求头信息比如双方约定的token,通过build方法返回请求对象。发起post请求并获得响应:通过请求客户端的execute方法执行请求并获得返回值请求响应。获取响应结果:获取响应对象的实体HttpEntity,通过EntityUtils的toString方法将实体转成字符串(例子里为请求的一个jsp(html)页面,实际返回为jsp页面里html内容),这里一般还要指定字符集,尤其是当实体里没有指定字符集时。使用HttpClient发送一个JSON数据格式的POST请求try { CloseableHttpClient client = HttpClients.createDefault(); JSONObject json = new JSONObject(); json.put("str", "字符串"); json.put("num", 123); json.put("bool", true); json.put("date", Calendar.getInstance().getTime());//日期类型的一般会约定会特定格式的字符串,这里仅是示例 json.put("ja", new JSONArray()); HttpUriRequest post = RequestBuilder.post("http://localhost:8181/auri")// .setEntity(new StringEntity(json.toString(), ContentType.APPLICATION_JSON))//json的content-type已经包含utf-8的编码了 .build(); System.out.println(post.toString()); HttpResponse res = client.execute(post); System.out.println("statusLine:" + res.getStatusLine().getStatusCode()); System.out.println(res.getEntity().getContentType().toString()); System.out.println(EntityUtils.toString(res.getEntity())); } catch (Exception e) { e.printStackTrace(); } 创建一个请求客户端:HttpClients.createDefault(),用来实际发起调用post请求,可以类比成浏览器。组装Json请求数据:通过JSONObject对象组装数据。创建一个post请求:通过请求构造器RequestBuilder的post方法构造一个post请求,通过setEntity方法向post请求里放置请求实体,请求实体需要通过StringEntity对象包装,并指定content-type为json,通过build方法返回请求对象。发起http请求并获得响应:通过请求客户端的execute方法执行请求并获得返回值请求响应。获取响应结果:获取响应对象的实体HttpEntity,通过EntityUtils的toString方法将实体转成字符串,这里一般还要指定字符集,尤其是当返回的实体里没有指定字符集时。使用HttpClient发送一个包含附件上传的POST请求try { CloseableHttpClient client = HttpClients.createDefault(); MultipartEntityBuilder meb = MultipartEntityBuilder.create(); meb.setMode(HttpMultipartMode.RFC6532);//must meb.addBinaryBody("file1", new File("D:/abc.jpg")); meb.addBinaryBody("file2", new File("D:/你好.jpg")); meb.addTextBody("testIn1", "上传表单1", ContentType.DEFAULT_TEXT.withCharset("GBK"));//GBK or UTF-8, either is ok meb.addTextBody("testIn2", "true"); meb.addTextBody("aid", "3"); meb.setCharset(Charset.forName("UTF-8"));//must HttpUriRequest multiPost = RequestBuilder.post("http://localhost:9092/web/test")// .setEntity(meb.build())// .build(); HttpResponse res = client.execute(multiPost); System.out.println("statusLine:" + res.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(res.getEntity())); } catch (Exception e) { e.printStackTrace(); }
1.创建一个请求客户端:HttpClients.createDefault(),用来实际发起调用post请求,可以类比成浏览器。
2.组装表单请求数据:因需要传递文件,所以通过MultipartEntityBuilder构造器组装表单实体请求数据。
2.1 设置mode为HttpMultipartMode.RFC6532(必须);
2.2 设置字符集为UTF-8(必须);
2.3 通过addBinaryBody追加文件;
2.4 通过addTextBody追加文本参数,若文本为中文则必须指定字符集为GBK或者UTF-8。
3.创建一个post请求:通过请求构造器RequestBuilder的post方法构造一个post请求,通过setEntity方法向post请求里放置请求参数,通过addHeader方法向post请求里追加请求头信息,请求头信息比如双方约定的token,通过build方法返回请求对象。
4.发起post请求并获得响应:通过请求客户端的execute方法执行请求并获得返回值请求响应。
5.获取响应结果:获取响应对象的实体HttpEntity,通过EntityUtils的toString方法将实体转成字符串,这里一般还要指定字符集,尤其是当实体里没有指定字符集时。
注意:MultipartEntityBuilder必须指定mode为HttpMultipartMode.RFC6532,且必须设置字符集为UTF-8,否则若传递的文件名包含中文,则文件名乱码 ;对于普通的文本参数,中文指定UTF-8或者GBK接收方均未发现乱码情况;接收方需要将请求转为MultipartHttpServetRequest方可获取到文件,示例代码如下:public ModelAndView enterTest(HttpServletRequest req, HttpServletResponse res, DataObject para) throws Exception { System.out.println(req.getContentType()); MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req; MultipartFile mf = mr.getFile("file2"); System.out.println("getOriginalFilename:" + mf.getOriginalFilename()); System.out.println("getName:" + mf.getName()); ...... }
若感觉对您有用,可以转发并关注,您的关注是对我莫大的支持!
同学们的老熟人李华被注册成商标了昨天,随着高考的最后一声铃响,2021年高考正式落下帷幕。一般来说,高考最后一门科目都是英语考试,而英语考题中最值得注意的就是英语写作部分了。每年,考生们都需要帮助一位名叫李华的同
长城起名小能手,商标又出花样?起名是个技术活,长城汽车在这方面颇有心得,花式起名出圈,诸如哈佛大狗长城炮坦克300等,不仅名字如雷贯耳,销量也十分喜人。近日,小知查询发现,长城汽车不仅是起名小能手,在商标注册保
挖高管注册OCar商标,OPPO也要造车了?充电5分钟,开车两小时?又一个手机厂商OPPO显示出造车的苗头。据了解,OPPO广东移动通信有限公司于今年5月份申请了OCar商标,注册在第9类科学仪器相关产品上。OCar商标由字
苹果跟高通的授权费问题越闹越大了苹果跟高通之间的授权费纠纷,现在又有了新的进展。后者在月初提出反诉后,现在又发布了一份声明,其中提到苹果最近已停止向iPhone制造商支付涉及高通的授权费,因为其坚持认为自己已经为
小米MIX系列又回来了,这次的版本惊喜更多,将首发液体镜头自从小米官宣了春季新品发布会后,可以说本人就一直在关注着小米的微博,就等着新品的官宣,看看小米这一次带给大家的到底是不是惊喜。可以说,再看见小米官宣小米11大杯超大杯的时候,本人就
新品亮相小米MIX新体验,让普通人能买得起的折叠屏3月29日,小米召开以生生不息为主题的新品发布会。发布会上,不少新产品和黑科技首次亮相,赚足米粉们的眼球。小米自研澎湃芯片,硅氧负极电池,液态镜头以及旗舰影像等众多新科技惊艳亮相,
小米新机再度来袭,有了超高性能不够,游戏体验也很能打小米一直以来的表现米粉们有目共睹,从内部配置再到核心技术,小米都是诚意满满,先前斥巨资打造土豪邀请函,而且还投入了巨额前期预算,种种迹象都表明小米始终在玩真的,没有与米粉们开玩笑。
小米三星联合研发大底GN2,与小米11Pro碰撞一起会怎样3月29日,小米发布会正式举行。在这次的发布会上,让我觉得十分惊喜的就是小米与三星联合研发的GN2超大底。众所周知,现在智能手机市场真正的短板其实在影像技术。现在的智能手机虽然能够
健康烹饪新味道,秘诀就在于方太油烟机灶台套装在我心里,中餐永远是味道最丰富菜式变幻最多的饮食风格,无论是以炖为主香气扑鼻的东北菜,还是以麻为主辅辣增味的激爽川菜,亦或是用料考究制作精细的粤菜,都夹杂着中国人特殊的饮食哲学和生
香港证监会已收到多个关于加密货币ETF的请求加密货币总市值突破2。8万亿美元,超过微软和苹果据最新数据显示,目前加密货币总市值已突破2。8万亿美元,本文撰写时为2,855,724,225,981美元,24小时涨幅3。2,超过
兰蔻x百人测评团联动出击,探索双十一品牌增量密码早在国庆的时候,就有网友在微博调侃说10月的工资随了份子,而11月的工资用来双十一,把自己安排的明明白白。实际上,双十一活动如今早已如火如荼地进行了数日,从预售到返场,不断拉长的双