xiaolenglala 2019-11-07 10:47 采纳率: 66.7%
浏览 963

MultipartRequestEntity post 请求发送。接收端用java httpserver httpexchange 接受。能不能单独取出 request sign 两块内容

package com.test.HttpClient;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StreamUtils;
/**

  • Hello world!
    *
    */
    public class HttpClientApp
    {
    private static final Logger logger = LoggerFactory.getLogger(HttpClientApp.class);
    public static void main( String[] args )
    {
    String url="http://127.0.0.1:8081/SpringMvc1/student";
    String reqStr="aaaaaaa";
    String contentType="application/json";
    String charset="UTF-8";
    String ss=doPost( url, reqStr, contentType, charset) ;
    System.out.println("返回内容为1:" +ss);
    Part[] parts=new Part[2];
    parts[0]=new StringPart("request", "请求报文体",charset);
    parts[1]=new StringPart("sign", "数字签名",charset);
    url="http://127.0.0.1:8081/SpringMvc1/BossServlet";
    // url="http://127.0.0.1:8081/SpringMvc1/fileupload";

    String response=doPostMuStr( url,  parts) ;
    System.out.println("返回内容为1:" +response);
    

    }
    /**

    • 执行一个HTTP POST请求,返回请求响应的HTML *
    • @param url 请求的URL地址
    • @param reqStr 请求的查询参数,可以为null
    • @param charset 字符集
    • @return 返回请求响应的HTML
      */
      public static String doPost(String url, String reqStr, String contentType, String charset) {
      HttpClient client = new HttpClient();

      PostMethod method = new PostMethod(url);
      try {
      HttpConnectionManagerParams managerParams = client.getHttpConnectionManager().getParams();
      managerParams.setConnectionTimeout(30000); // 设置连接超时时间(单位毫秒)
      managerParams.setSoTimeout(30000); // 设置读数据超时时间(单位毫秒)

      method.setRequestEntity(new StringRequestEntity(reqStr, contentType, "utf-8"));
      
      client.executeMethod(method);
      System.out.println("返回的状态码为:" +method.getStatusCode());
      if (method.getStatusCode() == HttpStatus.SC_OK) {
      

      // return StreamUtils.copyToString(method.getResponseBodyAsStream(), Charset.forName(charset));
      return IOUtils.toString(method.getResponseBodyAsStream(),"utf-8");

      }
      

      } catch (UnsupportedEncodingException e1) {
      logger.error(e1.getMessage());
      return "";
      } catch (IOException e) {
      logger.error("执行HTTP Post请求" + url + "时,发生异常!" + e.toString());
      return "";
      } finally {
      method.releaseConnection();
      }
      return null;
      }
      /**

    • 执行一个HTTP POST请求,返回请求响应的HTML
      *

    • @param url 请求的URL地址

    • @param reqStr 请求的查询参数,可以为null

    • @param charset 字符集

    • @return 返回请求响应的HTML
      */
      public static String doPostMuStr(String url, Part[] reqStr) {
      HttpClient client = new HttpClient();

      PostMethod method = new PostMethod(url);
      try {
      HttpConnectionManagerParams managerParams = client.getHttpConnectionManager().getParams();
      managerParams.setConnectionTimeout(30000); // 设置连接超时时间(单位毫秒)
      managerParams.setSoTimeout(30000); // 设置读数据超时时间(单位毫秒)

      method.setRequestEntity(new MultipartRequestEntity(reqStr, method.getParams()));
      

      // method.setContentChunked(true);
      client.executeMethod(method);
      System.out.println("返回的状态码为:" +method.getStatusCode());
      if (method.getStatusCode() == HttpStatus.SC_OK) {
      return IOUtils.toString(method.getResponseBodyAsStream(),"utf-8");

      }
      } catch (UnsupportedEncodingException e1) {
      logger.error(e1.getMessage());
      return "";
      } catch (IOException e) {
      logger.error("执行HTTP Post请求" + url + "时,发生异常!" + e.toString());
      return "";
      } finally {
      method.releaseConnection();
      }
      return null;
      }

      }

  • 写回答

1条回答

  • simensk 2024-05-02 21:06
    关注

    在使用 MultipartRequestEntity(通常这个类来自于Apache HttpClient的旧版本)来发送POST请求时,你可能在构建一个multipart表单请求,该请求可能包含多个部分(part),例如文本字段、文件上传等。如果你想在接收端(Java HttpServer)中单独取出某个特定的部分(例如名为sign的部分),你需要解析multipart请求体。

    Java的内置HttpServer和HttpExchange类并不直接提供multipart解析的功能,因此你需要使用额外的库来解析multipart请求。一个常用的库是Apache Commons FileUpload。

    以下是一个使用Apache Commons FileUpload来解析multipart请求并单独取出名为sign的部分的Java样例代码:

    首先,确保你的项目中包含了Apache Commons FileUpload和Apache Commons IO的依赖。你可以使用Maven或Gradle来添加这些依赖。

    Maven依赖示例:

    xml

    <dependencies>  
        <!-- Apache Commons FileUpload -->  
        <dependency>  
            <groupId>commons-fileupload</groupId>  
            <artifactId>commons-fileupload</artifactId>  
            <version>1.4</version>  
        </dependency>  
        <!-- Apache Commons IO -->  
        <dependency>  
            <groupId>commons-io</groupId>  
            <artifactId>commons-io</artifactId>  
            <version>2.11.0</version>  
        </dependency>  
    </dependencies>
    

    然后,你可以在HttpServer的Handler中使用以下代码来解析multipart请求:

    java

    import com.sun.net.httpserver.HttpExchange;  
    import com.sun.net.httpserver.HttpHandler;  
    import org.apache.commons.fileupload.FileItem;  
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
    import org.apache.commons.fileupload.servlet.ServletFileUpload;  
      
    import javax.servlet.http.HttpServletRequest;  
    import java.io.ByteArrayOutputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.util.List;  
      
    public class MultipartHandler implements HttpHandler {  
          
        @Override  
        public void handle(HttpExchange exchange) throws IOException {  
            // 假设你已经将HttpServletRequestWrapper包装在了HttpExchange的上下文中  
            // 或者你需要自己实现HttpServletRequestWrapper来适配HttpExchange  
            // HttpServletRequest request = ...; // 这里应该是你的请求包装器  
      
            // 简化示例,直接从HttpExchange获取请求体  
            InputStream requestBody = exchange.getRequestBody();  
      
            // 创建FileItemFactory实现  
            DiskFileItemFactory factory = new DiskFileItemFactory();  
      
            // 创建一个新的文件上传处理程序  
            ServletFileUpload upload = new ServletFileUpload(factory);  
      
            // 解析请求  
            try {  
                // 注意:这里我们假设你有一个HttpServletRequestWrapper,它可以将HttpExchange转换为HttpServletRequest  
                // List<FileItem> items = upload.parseRequest(request);  
      
                // 由于没有HttpServletRequestWrapper,你需要自己解析requestBody流  
                // 这通常比较复杂,因为你需要自己处理multipart请求的边界等细节  
                // 这里为了简化示例,我们假设你已经有了FileItem的列表  
                List<FileItem> items = parseMultipartRequest(requestBody, upload.getSizeMax()); // 这是一个假设的方法,你需要自己实现它  
      
                // 遍历所有项并查找名为"sign"的项  
                for (FileItem item : items) {  
                    if (item.isFormField() && "sign".equals(item.getFieldName())) {  
                        // 这是一个文本字段,获取其值  
                        String sign = item.getString();  
                        System.out.println("Sign: " + sign);  
                        // ... 在这里处理sign的值 ...  
                    } else {  
                        // 处理其他类型的项(如文件上传)  
                        // ...  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
                // 处理异常,例如返回错误响应给客户端  
            }  
      
            // ... 发送响应给客户端 ...  
        }  
      
        // 这是一个假设的方法,用于从InputStream中解析multipart请求  
        // 你需要实现这个方法,或者使用现有的库(如Apache Commons FileUpload的底层实现)来帮助你完成这个任务  
        private List<FileItem> parseMultipartRequest(InputStream requestBody, long sizeMax) throws Exception {  
            // 实现multipart请求的解析逻辑  
            // 这通常涉及读取请求体,查找边界,解析各个部分等  
            // 由于这个逻辑比较复杂,并且Apache Commons FileUpload已经为我们提供了这个功能,  
            // 因此建议直接使用该库或查看其源码以了解如何实现这个逻辑  
            throw new UnsupportedOperationException("This is a placeholder method. You need to implement multipart request parsing.");  
        }  
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题