httpclient发送multipart/form-data类型参数和用MultipartRequest接收参数

一、利用HttpClient发送基于Content-Type="multipart/form-data"形式的表单

package com.test.httpclient;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;

import org.apache.commons.httpclient.methods.RequestEntity;
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.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

import org.apache.commons.httpclient.HttpClient;

public class SendXmlAction
{
    public String execute() throws ServletException, IOException
    {
        String xmlhead = this.getRequest().getParameter("xmlhead");
        String xmlbody = this.getRequest().getParameter("xmlbody");
        System.out.println("xmlhead == "+xmlhead);
        System.out.println("xmlbody == "+xmlbody);

        // 用远程服务的URL设置生成POST方法,供HTTP客户端执行
        String remoteUrl = "http://**.**.***.***:8888/project/receiveServlet";

        PostMethod method = new PostMethod(remoteUrl);

        // multipart/form-data; boundary=---------------------------7de2b13a790640

        //method.addParameter("xmlhead", xmlhead);
        //method.addParameter("xmlbody", xmlbody);

        HttpClient HTTP_CLINET = new HttpClient();

        synchronized (HTTP_CLINET)
        {
            try
            {
                //使用多重发送方式,发送两个独立的两个XML Part,基于Content-Type="multipart/form-data"形式的表单
                Part[] parts = {new StringPart("xmlhead",xmlhead), new StringPart("xmlbody",xmlbody)}; //StringPart和FilePart都可以放进去
                RequestEntity requestEntity = new MultipartRequestEntity(parts, method.getParams());
                method.setRequestEntity(requestEntity);

                method.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 30000);
                //链接超时 30秒
                HTTP_CLINET.getHttpConnectionManager().getParams().setConnectionTimeout(30000);
                //读取超时 30秒
                HTTP_CLINET.getHttpConnectionManager().getParams().setSoTimeout(30000);

                HTTP_CLINET.executeMethod(method);

                String[] result = new String[2];
                result[0] = String.valueOf(method.getStatusCode());
                result[1] = method.getResponseBodyAsString();
                System.out.println("http status : "+result[0]);
                System.out.println("http response : "+result[1]);

            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (method != null)
                {
                    method.releaseConnection();
                }
                method = null;
            }
        }

        return "success";
    }
}

二、MultipartRequest接收参数

package com.test.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.oreilly.servlet.MultipartRequest;

public class BossServlet extends HttpServlet
{

    /** serialVersionUID */
    private Logger logger = Logger.getLogger(BossServlet.class);

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException
    {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
        // MultipartRequest
        String head = null ;
        String body = null ;

        try
        {
            File fileDir = new File(this.getServletContext().getRealPath("/formhttp"));
            if (!fileDir.exists())
            {
                fileDir.mkdirs();
            }

            int inmaxPostSize = 10 * 1024 * 1024;

            // utf-8中文编码模式上传文件
            MultipartRequest multirequest = new MultipartRequest(request,fileDir.getAbsolutePath(),inmaxPostSize,"UTF-8"); 

            head = multirequest.getParameter("head");
            body = multirequest.getParameter("body");
            System.out.println("xmlHead2 = " + xmlHead);
            System.out.println("xmlBody2 = " + xmlBody);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        response.setCharacterEncoding("UTF-8");
        response.setContentType("multipart/mixed;boundary=---------------------------7de2b13a790640");
        PrintWriter out = response.getWriter();

        String res = null;
        try
        {
            res = .....
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        if (!(res == null || "".equals(res)))
        {
            try
            {
                out.println(res);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                out.close();
            }

        }
    }

    public void init() throws ServletException
    {
        super.init();
    }
}

若发送基于Content-Type="multipart/form-data"形式的表单,却通过request.getParameter("**")获取参数值,则获取的参数值为空。

时间: 2024-08-30 03:02:11

httpclient发送multipart/form-data类型参数和用MultipartRequest接收参数的相关文章

httpClient发送https 请求

做项目要用到httpClient发送https到服务器,要求URL中带参数,并且发送xml格式的报文,第一次做,在这里记录一下,以便以后查询的帮助别人:本文在证书配置正确的前提下执行 客户端代码;     public static void httpsRequest() throws Exception {      System.out.println("this is https");         KeyStore trustStore  = KeyStore.getInst

HTML5 Form Data 对象的使用

HTML5 Form Data 对象的使用 MDN: https://developer.mozilla.org/zh-CN/docs/Web/Guide/Using_FormData_Objects XMLHttpRequest Level 2 添加了一个新的接口——FormData.利用 FormData 对象,我们可以通过 JavaScript 用一些键值对来模拟一系列表单控件,我们还可以使用 XMLHttpRequest 的 send() 方法来异步的提交表单.与普通的 Ajax 相比,

【转】form data和request payload的区别

HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp" enctype="text/plain">   <p>First name: <input type="text" name="fname" /></p>   <p>Last name: 

form data和request payload的区别

HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp" enctype="text/plain">   <p>First name: <input type="text" name="fname" /></p>   <p>Last name: 

表单提交数据格式form data

前言: 最近遇到的最多的问题就是表单提交数据格式问题了. 常见的三种表单提交数据格式,分别举例说明:(项目是vue的框架) 1.application/x-www-form-urlencoded 提交表单方法,js代码如下: submitForm() { let data = 'title="标题"&content="内容"&pic[]="image1"&pic[]="image2"&pic[]

AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式

HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value&name1=value1的形式在请求体中.通过chrome的开发人员工具能够看到例如以下(这里是可读的形式,不是真正的HTTP请求协议的请求格式): get请求: RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=

HttpClient发送get,post接口请求

HttpClient发送get post接口请求 /** * post * @param url POST地址 * @param data POST数据NameValuePair[] * @return 响应的参数 */ public static String post(String url,NameValuePair[] data){---------------get里面没有data只有url String response = ""; HttpClient httpClient

AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value&name1=value1的形式在请求体中.通过chrome的开发者工具可以看到如下(这里是可读的形式,不是真正的HTTP请求协议的请求格式): get请求: RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=str

httpclient发送无参数的post数据

两个问题: 1.httpclient如何发送一个没有任何参数的post数据呢? 2.Web工程如何去接收一个无参数的post呢? 起因: 今天(2014.11.10)在开发中碰到了一个问题,接口提供方提供的接口是要求使用post方式发送数据的,心想这不超简单的一个东西吗?直接post过去不就是了,但是,提供的接口是没有任何参数的,不是类似这种http://api.dutycode.com/data/parm=xxx这种接口,而是http://api.dutycode.com/data.这个地址直