博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java使用httpclient时,获取HttpPost对象中的入参
阅读量:6801 次
发布时间:2019-06-26

本文共 5216 字,大约阅读时间需要 17 分钟。

hot3.png

 在某些特殊情况下,需要获取HttpPost对象中的参数,demo如下

public static HttpResponse test( HttpPost post ) throws IOException{                /**         * 入参是HttpPost,在该方法中想根据HttpPost中的参数做一些逻辑,这时候就需要想办法获取到HttpPost中的入参         */        HttpEntity entity = post.getEntity();      //代码一        //      InputStream inputStream = entity.getContent();      //方法一//      System.out.println(EntityUtils.toString(entity));   //方法二        //获取入参的方法        MyHttpEntityUnil.test(entity);   //方法三                HttpClient httpclient = new DefaultHttpClient();        return httpclient.execute(post);    }    public static void main(String[] args) throws ParseException, IOException {                ContentType contentType = ContentType.create("text/plain", Consts.UTF_8);        MultipartEntityBuilder builder = MultipartEntityBuilder.create();                builder.addTextBody("aaa", "bbb", contentType);                HttpEntity requestEntity = builder.build();                HttpPost post = new HttpPost("http://127.0.0.1:8080/index");        post.setEntity(requestEntity);                test(post);            }

常规思路如demo中的方法一、方法二都是通过获取HttpEntity的输入流(InputStream),但是会抛一个异常,原因是该处使用的HttpEntity是实现类MultipartFormEntity,而MultipartFormEntity并没有实现接口HttpEntity的getContent()方法。这时候就要转变思路,查看MultipartFormEntity的源码,如下

/* * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements.  See the NOTICE file * distributed with this work for additional information * regarding copyright ownership.  The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License.  You may obtain a copy of the License at * *   http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied.  See the License for the * specific language governing permissions and limitations * under the License. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation.  For more * information on the Apache Software Foundation, please see * 
. * */package org.apache.http.entity.mime;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.message.BasicHeader;import org.apache.http.protocol.HTTP;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;class MultipartFormEntity implements HttpEntity { private final AbstractMultipartForm multipart; private final Header contentType; private final long contentLength; MultipartFormEntity( final AbstractMultipartForm multipart, final String contentType, final long contentLength) { super(); this.multipart = multipart; this.contentType = new BasicHeader(HTTP.CONTENT_TYPE, contentType); this.contentLength = contentLength; } AbstractMultipartForm getMultipart() { return this.multipart; } public boolean isRepeatable() { return this.contentLength != -1; } public boolean isChunked() { return !isRepeatable(); } public boolean isStreaming() { return !isRepeatable(); } public long getContentLength() { return this.contentLength; } public Header getContentType() { return this.contentType; } public Header getContentEncoding() { return null; } public void consumeContent() throws IOException, UnsupportedOperationException{ if (isStreaming()) { throw new UnsupportedOperationException( "Streaming entity does not implement #consumeContent()"); } } public InputStream getContent() throws IOException { throw new UnsupportedOperationException( "Multipart form entity does not implement #getContent()"); } public void writeTo(final OutputStream outstream) throws IOException { this.multipart.writeTo(outstream); }}

通过查看源码可以发现,其实数据是保存在私有属性AbstractMultipartForm中的,并且有一个getMultipart()方法可以获取该属性,但是该方法只能同包下使用,所以新建一个相同路径的包,在该包下调用getMultipart()方法。代码如下

package org.apache.http.entity.mime;import java.io.IOException;import java.io.Reader;import java.util.List;import org.apache.http.HttpEntity;import org.apache.http.entity.mime.content.StringBody;public class MyHttpEntityUnil {    public static void test( HttpEntity entity ) throws IOException{        List
bodyParts = ((MultipartFormEntity)entity).getMultipart().getBodyParts(); for( FormBodyPart bodyPart : bodyParts ){ String name = bodyPart.getName(); System.out.println(name); StringBody body = (StringBody) bodyPart.getBody(); Reader reader = body.getReader(); char[] cs = new char[1024]; reader.read(cs); System.out.println(new String(cs)); } } }

 

 

 

转载于:https://my.oschina.net/u/3865831/blog/3005326

你可能感兴趣的文章
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
查看>>
Neo4j REST API使用实例---ttlsa教程系列之neo4j(二)
查看>>
docker使用指南
查看>>
如何让对方发给你需要的文件格式?
查看>>
php学习笔记--运算符号
查看>>
IPv6已分配地址中国仅占0.29%
查看>>
解决Lync2010和Lync2013转接电话断开的问题
查看>>
find grep wc awk sed sort uniq split指令详解
查看>>
高并发中的卡死状态 -HashMap
查看>>
http上传文件深度解析-高性能http传输
查看>>
Linux下配置Java环境变量
查看>>
Docker简介
查看>>
HTTP State Management Mechanism(HTTP 状态管理机制)
查看>>
IOS之禁用UIWebView的默认交互行为
查看>>
c 睡觉前请关灯 的第一次尝试
查看>>
Linux 的shell脚本编程
查看>>
Git 使用vi或vim命令打开、关闭、保存文件
查看>>
Juniper ScreenOS 路由策略配置
查看>>
go 语言中 byte 与 int 互转, string 与 byte 互转
查看>>
东航客机成功迫降(我国民航史上首例大型客机迫降成功)
查看>>