在使用httpclient请求用MultipartEntityBuilder配置参数时,远程服务器无法获取参数_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 在使用httpclient请求用MultipartEntityBuilder配置参数时,远程服务器无法获取参数

在使用httpclient请求用MultipartEntityBuilder配置参数时,远程服务器无法获取参数

 2018/4/13 15:59:35  huangshanghua  程序员俱乐部  我要评论(0)
  • 摘要:在使用httpclient请求时,远程服务器无法获取参数。1、包版本:httpclient-4.5.3.jar,httpcore-4.4.6.jar,httpmime-4.5.3.jar2、本地同一服务器通过httpclient调用可以获取到传递的参数(**通过**)3、本地不同服务器通过httpclient调用可以获取到传递的参数(**通过**)4、远程服务器通过httpclient调用不能获取到传递的参数(**不通过**)5、已确保参数名一致,因为换一种写法可以获取到参数代码
  • 标签:使用 配置 client Ten 服务器 远程服务器 服务 远程 HTTP
在使用httpclient请求时,远程服务器无法获取参数。
1、包版本:httpclient-4.5.3.jar,httpcore-4.4.6.jar,httpmime-4.5.3.jar
2、本地同一服务器通过httpclient调用可以获取到传递的参数(**通过**
3、本地不同服务器通过httpclient调用可以获取到传递的参数(**通过**
4、远程服务器通过httpclient调用不能获取到传递的参数(**不通过**
5、已确保参数名一致,因为换一种写法可以获取到参数

代码:
class="java" name="code">
       /**
     * 提交数据,返回JSONObject对象
     * 
     * @param url 请求路径
     * @param headerParams 请求头消息参数
     * @param requestParams 请求业务参数
     * 
     * @return
     */
    public static JSONObject httpPostToJson(String url,JSONObject headerParams,JSONObject requestParams) {
        HttpPost httpPost = null;
        JSONObject jsonObject = new JSONObject();
        try {
             
            // 创建HttpClient实例
            HttpClient httpClient = HttpClients.createDefault();
             
            // 创建httpPost实例,设置超时和头消息
            httpPost = createHttpPost(url,headerParams);
             
            //设置httpPost请求参数
            setHttpRequestParams(httpPost, requestParams);
             
            //执行httpPost请求
            jsonObject = executeHttpClient(httpClient, httpPost);
         
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", ERROR_STATUS_CODE);
            jsonObject.put("msg", "服务器遇到错误,无法完成请求");
            jsonObject.put("data", "{}");
        }finally{
            if(httpPost != null){
                httpPost.abort(); 
            }
        }
 
       /**
     * 创建httpPost请求,设置超时和头消息
     * 
     * @param _url 请求路径
     * @param headerParams 头参数集合
     * @return
     */
    private static HttpPost createHttpPost(String _url, JSONObject headerParams)throws Exception{
         
        // 创建Post方法实例
        HttpPost httpPost = new HttpPost(_url);
         
        // 设置连接超时
        RequestConfig requestConfig = RequestConfig.custom() 
                .setConnectTimeout(CONNECT_TIME_OUT).setConnectionRequestTimeout(CONNECTION_REQUEST_TIME_OUT)
                    .setSocketTimeout(SOCKET_TIME_OUT).build();  
        httpPost.setConfig(requestConfig);  
         
         // 构造消息头
         
        //设置头参数
        if(headerParams != null){
            for(Object key : headerParams.keySet()){
                httpPost.setHeader(key.toString(), headerParams.getString(key.toString()));
            }
        }
         
        return httpPost;
    }
     
       /**
     * 设置请求参数
     * 
     * @param httpPost
     * @param jsonObj
     * @param in
     */
    private static void setHttpRequestParams(HttpPost httpPost,JSONObject jsonObj)throws Exception{
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builderHttpRequestParams(httpPost, builder, jsonObj);
    }
     
    /**
     * 设置请求参数
     * 
     * @param httpPost
     * @param jsonObj
     * @param in
     */
    private static void builderHttpRequestParams(HttpPost httpPost,MultipartEntityBuilder builder,JSONObject jsonObj)throws Exception{
        if(jsonObj != null){
            for(Object key : jsonObj.keySet()){
                builder.addTextBody(key.toString(), jsonObj.getString(key.toString()));
            }
        }
        HttpEntity entity = builder.build();
        httpPost.setEntity(entity);
    }


解决方案(不是所有环境都能用):
public void processUpload(HttpServletRequest request, HttpServletResponse response){
      
    //检测是不是存在上传文件 
    boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
      
    if(isMultipart){ 
      DiskFileItemFactory factory = new DiskFileItemFactory();
       
      // Create a new file upload handler 
      ServletFileUpload upload = new ServletFileUpload(factory); 
        
      List<FileItem> items = null; 
        
      try { 
        // 解析request请求 
        items = upload.parseRequest(request); 
      } catch (FileUploadException e) { 
        e.printStackTrace(); 
      } 
       
      if(items!=null){ 
        //解析表单项目 
        Iterator<FileItem> iter = items.iterator(); 
        while (iter.hasNext()) { 
          FileItem item = iter.next(); 
           
          //如果是普通表单属性 
          if (item.isFormField()) { 
            //相当于input的name属性  <input type="text" name="content"> 
            String name = item.getFieldName();
             
            //input的value属性 
            String value = item.getString();
             
            System.out.println("属性:" + name + " 属性值:" + value); 
          } 
          //如果是上传文件 
          else { 
            //属性名 
            String fieldName = item.getFieldName(); 
             
            //上传文件路径 
            String fileName = item.getName(); 
            fileName = fileName.substring(fileName.lastIndexOf("/") + 1);// 获得上传文件的文件名 
             
          
          } 
        } 
      } 
    } 
  }

上一篇: C# 创建PDF表格 下一篇: 加载配置文件
发表评论
用户名: 匿名