Connection is not open httpClient 的问题解决方案

在使用httpClient客户端工具时,需要设置标红颜色的属性,否则就会出现Connection is not open 这个异常,以及这个异常会引发其他的一些异常。

httpClient默认连接数为2,导致并发用户超过2个时,响应时间增加,后来将连接数改成32,性能提升16倍。

HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
        HttpConnectionManagerParams params = httpConnectionManager.getParams();
        params.setConnectionTimeout(5000); 
        params.setSoTimeout(20000); 
        params.setDefaultMaxConnectionsPerHost(32);//very important!! 
        params.setMaxTotalConnections(256);//very important!! 

        this.client = new HttpClient(httpConnectionManager);
        // 设置编码
        this.client.getParams().setContentCharset(CharsetHelper.GBK);
        this.client.getParams().setHttpElementCharset(CharsetHelper.GBK);

转载于:https://my.oschina.net/lichao100/blog/699862

### 解决RPC调用中 'Current request is not a multipart request' 错误 当遇到 `Current request is not a multipart request` 的错误提示时,通常意味着客户端发送的数据不符合服务器端期望的多部分表单数据格式。此问题可能源于多种因素。 #### 原因分析 1. **请求头设置不正确** 客户端未正确设置 `Content-Type` 头部为 `multipart/form-data` 或者该头部丢失[^1]。 2. **缺少必要的边界参数** 对于 `multipart/form-data` 类型的请求,必须指定一个唯一的边界字符串来分隔不同的字段或文件片段。如果这个边界缺失,则无法形成有效的多部分请求体。 3. **框架配置不当** 如果使用的是Spring MVC或其他Web应用开发框架,在控制器方法签名处应声明接收MultipartFile类型的参数用于处理上传文件的操作;同时还需要确保相应的依赖库已加入到项目的构建路径下(如对于Maven项目需添加对应的pom.xml配置)[^2]。 4. **HTTP客户端实现有误** 使用像Apache HttpClient这样的工具类库发起POST请求时,要特别注意按照文档说明组装好整个消息体结构,包括但不限于初始化MultiPartEntity对象并向其中添加TextBody、FileBody等组件实例。 #### 解决方案 针对上述每一种可能性提供具体的修复措施: ##### 正确设定请求头 确保每次发出带有附件或者其他二进制流形式的内容之前都显式指定了合适的媒体类型作为请求的一部分: ```http POST /upload HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ``` ##### 添加边界参数 在实际编码过程中可以通过编程方式动态生成随机数串作为boundary值,并将其附加至`Content-Type`属性后面跟随的一个分号之后的位置上。例如Java代码如下所示: ```java String boundary = "---------------------------" + System.currentTimeMillis(); HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection(); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); // 继续编写其他逻辑... ``` ##### 配置服务端支持 假设正在使用的是一套基于Spring Boot的应用程序架构体系的话,那么可以在application.properties/yml文件里增加一些额外选项以便更好地适应此类场景需求: ```yaml spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=1MB # 可根据实际情况调整大小限制 spring.servlet.multipart.max-request-size=10MB # 同样可以根据业务特点灵活修改数值范围 ``` 另外还需确认Controller层的方法定义能够接受来自前端传递过来的对象实体,比如这样: ```java @RequestMapping(value="/fileUpload", method=RequestMethod.POST) public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file){ // 文件保存等相关操作... } ``` ##### 调整HTTP客户端行为 如果是通过自定义的方式模拟浏览器提交过程的话,请参照官方API指南严格遵循既定流程完成各项准备工作后再尝试重新触发网络交互动作。以下是利用OkHttp执行异步任务的例子之一: ```java RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("title","test title") .addFormDataPart("image","", RequestBody.create(MediaType.parse("image/png"),new File("/path/to/image.png"))) .build(); Request request = new Request.Builder().url("https://example.com/upload").post(requestBody).build(); client.newCall(request).enqueue(new Callback(){ @Override public void onFailure(Call call, IOException e){ /* ... */ } @Override public void onResponse(Call call, Response response)throws IOException{ /* ... */} }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值