平常我们对接第三方都是以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);