当前位置:

java 发送 http 文件 post,form-data格式的数据,MultipartEntityBuilder addTextBody文乱码

访客 2024-02-07 1036 0

平常我们对接第三方都是以json的数据进行数据交互的,这次第三方接口只支持form-data格式的表单数据,传json数据对方不支持,通过百度和尝试各种方案最终完美解决,后期再慢慢优化吧。还有一个问题,数据中包含中文的户,到第三方是乱码的,经过百度参考前辈的经验,完没解决addTextBody乱码问题。记录下工作中遇到的一个小问题!

请求通过httpClient上传文件

  • packagecom.example.demo.controller;
  • importorg.apache.http.HttpEntity;
  • importorg.apache.http.client.methods.CloseableHttpResponse;
  • importorg.apache.http.client.methods.HttpPost;
  • importorg.apache.http.entity.ContentType;
  • importorg.apache.http.entity.mime.HttpMultipartMode;
  • importorg.apache.http.entity.mime.MultipartEntityBuilder;
  • importorg.apache.http.entity.mime.content.StringBody;
  • importorg.apache.http.impl.client.CloseableHttpClient;
  • importorg.apache.http.impl.client.HttpClients;
  • importorg.apache.http.protocol.HTTP;
  • importorg.apache.http.util.EntityUtils;
  • importjava.io.File;
  • importjava.io.IOException;
  • /**
  • *@program:demo
  • *@description:描述
  • *@author:
  • *@date:2022-09-0814:07
  • **/
  • publicclassTestFormData{
  • publicstaticvoidmain(Stringargs[])throwsException{
  • Stringurl="http://127.0.0.1/subject/file";
  • Filefile=newFile("/Users/Desktop/5555.png");
  • CloseableHttpClienthttpClient=HttpClients.createDefault();
  • CloseableHttpResponseresponse=null;
  • try{
  • HttpPosthttpPost=newHttpPost(url);
  • //HttpMultipartMode.RFC6532参数的设定是为避免文件名为中文时乱码
  • MultipartEntityBuilderbuilder=MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
  • httpPost.addHeader("Authorization","11222233333");//头部放文件上传的head可自定义
  • //builder.addTextBody("name","张三");汉字会乱码需要用下面的方法处理
  • ContentTypecontentType=ContentType.create(HTTP.PLAIN_TEXT_TYPE,HTTP.UTF_8);
  • StringBodystringBody=newStringBody("李四5",contentType);
  • builder.addPart("name",stringBody);
  • builder.addBinaryBody("photo",file);//其余参数,可自定义
  • builder.addTextBody("subject_type","1");
  • builder.addTextBody("start_time","1662691418");
  • builder.addTextBody("end_time","1662720218");
  • HttpEntityentity=builder.build();
  • httpPost.setEntity(entity);
  • response=httpClient.execute(httpPost);//执行提交
  • HttpEntityresponseEntity=response.getEntity();//接收调用外部接口返回的内容
  • //通过EntityUtils中的toString方法将结果转换为字符串
  • Stringresult=EntityUtils.toString(responseEntity);
  • System.out.println(result);//返回的json数据之后自己的业务处理
  • }catch(Exceptione){
  • //logger.error("上传文件失败:",e);
  • System.out.println("LLLLLLLl");
  • }finally{//处理结束后关闭httpclient的链接
  • try{
  • if(httpClient!=null){
  • httpClient.close();
  • }
  • }catch(IOExceptione){
  • e.printStackTrace();
  • }
  • }
  • }
  • }
  • postman这样传的数据格式

    httpcomponent框架MultipartEntityBuilderaddTextBody中文乱码

    //使用addPartStringBody代替addTextBody,解决中文乱码

    //builder.addTextBody(entry.getKey(),entry.getValue());

    ContentTypecontentType=ContentType.create(HTTP.PLAIN_TEXT_TYPE,HTTP.UTF_8);
    StringBodystringBody=newStringBody(entry.getValue(),contentType);
    builder.addPart(entry.getKey(),stringBody);

    发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~