zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C#获取根目录的方法集合
    C# 获取文件MD5值的方法
    VS2015 搭建 Asp.net core 开发环境
    【Networking】容器网络大观 && SDN 资料汇总
    【Networking】flannel,pipework,weave,udp,vxlan,ovs等资料
    【K8s】Kubernetes 最近正在看的资料
    【GoLang】go 微服务框架 && Web框架学习资料
    【Eclipse】eclipse che 协作开发
    【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
    【SpringBoot】SpringBoot 入门示例
  • 原文地址:https://www.cnblogs.com/huahua035/p/7922108.html
Copyright © 2011-2022 走看看