HTTP的DELETE方法Body传递参数问题解决

理论上,Delete method是通过url传递参数的,如果使用body传递参数呢?

前提:

使用HttpClient发送http请求

问题:

httpDelete对象木有setEntity方法

解决方案:覆盖HttpEntityEnclosingRequestBase,重新实现一个HttpDelete类

源码如下:

import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;

import java.net.URI;

/**
 * Description: HttpDelete 使用 body 传递参数
 * 参考:https://stackoverflow.com/questions/3773338/httpdelete-with-body
 * <p/>
 * User: lishaohua
 * Date: 2017/11/29  12:58
 */
@NotThreadSafe
public class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {

    public static final String METHOD_NAME = "DELETE";

    /**
     * 获取方法(必须重载)
     *
     * @return
     */
    @Override
    public String getMethod() {
        return METHOD_NAME;
    }

    public HttpDeleteWithBody(final String uri) {
        super();
        setURI(URI.create(uri));
    }

    public HttpDeleteWithBody(final URI uri) {
        super();
        setURI(uri);
    }

    public HttpDeleteWithBody() {
        super();
    }
}

该方法是参考HttpClient的HttpPost类实现的,查看HttpPost的源码:

import java.net.URI;

import org.apache.http.annotation.NotThreadSafe;

/**
 * HTTP POST method.
 * <p>
 * The HTTP POST method is defined in section 9.5 of
 * <a href="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
 * <blockquote>
 * The POST method is used to request that the origin server accept the entity
 * enclosed in the request as a new subordinate of the resource identified by
 * the Request-URI in the Request-Line. POST is designed to allow a uniform
 * method to cover the following functions:
 * <ul>
 *   <li>Annotation of existing resources</li>
 *   <li>Posting a message to a bulletin board, newsgroup, mailing list, or
 *     similar group of articles</li>
 *   <li>Providing a block of data, such as the result of submitting a form,
 *     to a data-handling process</li>
 *   <li>Extending a database through an append operation</li>
 * </ul>
 * </blockquote>
 * </p>
 *
 * @since 4.0
 */
@NotThreadSafe
public class HttpPost extends HttpEntityEnclosingRequestBase {

    public final static String METHOD_NAME = "POST";

    public HttpPost() {
        super();
    }

    public HttpPost(final URI uri) {
        super();
        setURI(uri);
    }

    /**
     * @throws IllegalArgumentException if the uri is invalid.
     */
    public HttpPost(final String uri) {
        super();
        setURI(URI.create(uri));
    }

    @Override
    public String getMethod() {
        return METHOD_NAME;
    }

}

没错,就是原封不动抄的!!!

如何使用?

很简单,替换原来的构造方法:

/**
         * 02、构建HttpDelete对象
         */
        //被抛弃的HttpDelete,因为不支持body传递参数
        //HttpDelete httpDelete = new HttpDelete(proxyURL);
        //使用我们重载的HttpDelete
        HttpDeleteWithBody httpDelete = new HttpDeleteWithBody(proxyURL);
        // 处理请求协议
        httpDelete.setProtocolVersion(super.doProtocol(servletRequest));
        // 处理请求头
        httpDelete.setHeaders(super.doHeaders(servletRequest));
        // 处理请求体
        try {
            InputStream inputStream = servletRequest.getInputStream();
            httpDelete.setEntity(new InputStreamEntity(inputStream));

            /*StringBuilder stringBuilder = new StringBuilder();
            BufferedReader bufferedReader = null;
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            }else {
                stringBuilder.append("");
            }
            logger.info("request params---------->"+stringBuilder.toString());
            httpDelete.setEntity(new StringEntity(stringBuilder.toString(), ContentType.APPLICATION_JSON));*/
        } catch (IOException e) {
            logger.error("set httpDelete entity fail", e);
            // 取流失败,则要抛出异常,阻止本次请求
            throw new RuntimeException(e);
        }

        logger.info("DELETE method handler end...");

 

参考文章

https://stackoverflow.com/questions/3773338/httpdelete-with-body

https://www.cnblogs.com/heyus/p/3790234.html

posted @ 2017-11-29 18:30  花花牛  阅读(68388)  评论(0编辑  收藏  举报