折腾了好几天的 HTTP 终于搞定了,经测试正常,不过是初步用例测试用的,因为后面还要修改先把当前版本保存在博客里吧。

其中POST因为涉及多段上传需要导入两个包文件,我用的是最新的 httpmine4.3 发现网上很多 MultipartEntity 相关的文章都是早起版本的,以前的一些方法虽然还可用,但新版本中已经不建议使用了,所以全部使用新的方式 MultipartEntityBuilder 来处理了。

httpmime-4.3.2.jar
httpcore-4.3.1.jar 

下载地址:http://hc.apache.org/downloads.cgi

有些镜像貌似打不开,页面上可以可以选择国内的 .cn 后缀的域名镜像服务器来下载

如果是 android studio 这里可能会遇到一个问题:Android Duplicate files copied in APK

经测试 POST 对中文处理也是正常的,没有发现乱码

下面是完整代码:

ZHttpRequest.java

package com.ai9475.util;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;/*** Created by ZHOUZ on 14-2-3.*/
public class ZHttpRequest
{protected String url = "";protected Map<String, String> headers = null;protected int connectionTimeout = 5000;protected int soTimeout = 10000;protected int statusCode = 200;protected String charset = HTTP.UTF_8;protected HttpGet httpGet;protected HttpPost httpPost;protected HttpParams httpParameters;protected HttpResponse httpResponse;protected HttpClient httpClient;protected String inputContent;/*** 设置当前请求的链接** @param url* @return*/public ZHttpRequest setUrl(String url){this.url = url;return this;}/*** 设置请求的 header 信息** @param headers* @return*/public ZHttpRequest setHeaders(Map headers){this.headers = headers;return this;}/*** 设置连接超时时间** @param timeout 单位(毫秒),默认 5000* @return*/public ZHttpRequest setConnectionTimeout(int timeout){this.connectionTimeout = timeout;return this;}/*** 设置 socket 读取超时时间** @param timeout 单位(毫秒),默认 10000* @return*/public ZHttpRequest setSoTimeout(int timeout){this.soTimeout = timeout;return this;}/*** 设置获取内容的编码格式** @param charset 默认为 UTF-8* @return*/public ZHttpRequest setCharset(String charset){this.charset = charset;return this;}/*** 获取 HTTP 请求响应信息** @return*/public HttpResponse getHttpResponse(){return this.httpResponse;}/*** 获取 HTTP 客户端连接管理器** @return*/public HttpClient getHttpClient(){return this.httpClient;}/*** 获取请求的状态码** @return*/public int getStatusCode(){return this.statusCode;}/*** 通过 GET 方式请求数据** @param url* @return* @throws IOException*/public String get(String url) throws IOException{// 设置当前请求的链接this.setUrl(url);// 实例化 GET 连接this.httpGet = new HttpGet(this.url);// 自定义配置 header 信息this.addHeaders(this.httpGet);// 初始化客户端请求this.initHttpClient();// 发送 HTTP 请求this.httpResponse = this.httpClient.execute(this.httpGet);// 读取远程数据this.getInputStream();// 远程请求状态码是否正常if (this.statusCode != HttpStatus.SC_OK) {return null;}// 返回全部读取到的字符串return this.inputContent;}public String post(String url, Map<String, String> datas, Map<String, String> files) throws IOException{this.setUrl(url);// 实例化 GET 连接this.httpPost = new HttpPost(this.url);// 自定义配置 header 信息this.addHeaders(this.httpPost);// 初始化客户端请求this.initHttpClient();Iterator iterator = datas.entrySet().iterator();MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);multipartEntityBuilder.setCharset(Charset.forName(this.charset));// 发送的数据while (iterator.hasNext()) {Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();multipartEntityBuilder.addTextBody(entry.getKey(), entry.getValue(), ContentType.create("text/plain", Charset.forName(this.charset)));}// 发送的文件if (files != null) {iterator = files.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();String path = entry.getValue();if ("".equals(path) || path == null) continue;File file = new File(entry.getValue());multipartEntityBuilder.addBinaryBody(entry.getKey(), file);}}// 生成 HTTP 实体HttpEntity httpEntity = multipartEntityBuilder.build();// 设置 POST 请求的实体部分this.httpPost.setEntity(httpEntity);// 发送 HTTP 请求this.httpResponse = this.httpClient.execute(this.httpPost);// 读取远程数据this.getInputStream();// 远程请求状态码是否正常if (this.statusCode != HttpStatus.SC_OK) {return null;}// 返回全部读取到的字符串return this.inputContent.toString();}/*** 为 HTTP 请求添加 header 信息** @param request*/protected void addHeaders(HttpRequestBase request){if (this.headers != null) {Set keys = this.headers.entrySet();Iterator iterator = keys.iterator();Map.Entry<String, String> entry;while (iterator.hasNext()) {entry = (Map.Entry<String, String>) iterator.next();request.addHeader(entry.getKey().toString(), entry.getValue().toString());}}}/*** 配置请求参数*/protected void setParams(){this.httpParameters = new BasicHttpParams();this.httpParameters.setParameter("charset", this.charset);// 设置 连接请求超时时间HttpConnectionParams.setConnectionTimeout(this.httpParameters, this.connectionTimeout);// 设置 socket 读取超时时间HttpConnectionParams.setSoTimeout(this.httpParameters, this.soTimeout);}/*** 初始化配置客户端请求*/protected void initHttpClient(){// 配置 HTTP 请求参数this.setParams();// 开启一个客户端 HTTP 请求this.httpClient = new DefaultHttpClient(this.httpParameters);}/*** 读取远程数据** @throws IOException*/protected void getInputStream() throws IOException{// 接收远程输入流InputStream inStream = this.httpResponse.getEntity().getContent();// 分段读取输入流数据ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buf = new byte[1024];int len = -1;while ((len = inStream.read(buf)) != -1) {baos.write(buf, 0, len);}// 将数据转换为字符串保存this.inputContent = new String(baos.toByteArray());// 数据接收完毕退出inStream.close();// 获取请求返回的状态码this.statusCode = this.httpResponse.getStatusLine().getStatusCode();}/*** 关闭连接管理器释放资源*/protected void shutdownHttpClient(){if (this.httpClient != null && this.httpClient.getConnectionManager() != null) {this.httpClient.getConnectionManager().shutdown();}}
}

MainActivity.java

这个我就只写事件部分了

    public void doClick(View view){ZHttpRequest request = new ZHttpRequest();String url = "";TextView textView = (TextView) findViewById(R.id.showContent);String content = "空内容";try {if (view.getId() == R.id.doGet) {url = "http://www.baidu.com";content = "GET数据:" + request.get(url);} else {url = "http://192.168.1.6/test.php";HashMap<String, String> datas = new HashMap<String, String>();datas.put("p1", "abc");datas.put("p2", "中文");datas.put("p3", "abc中文cba");datas.put("pic", this.picPath);HashMap<String, String> files = new HashMap<String, String>();files.put("file", this.picPath);content = "POST数据:" + request.post(url, datas, files);}} catch (IOException e) {content = "IO异常:" + e.getMessage();} catch (Exception e) {content = "异常:" + e.getMessage();}textView.setText(content);}

其中的 this.picPath 就是指定的SD卡中的相片路径 String 类型

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><ScrollViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><Buttonandroid:id="@+id/doGet"android:layout_width="fill_parent"android:layout_height="wrap_content"android:padding="10dp"android:layout_marginBottom="10dp"android:text="GET请求"android:onClick="doClick"/><Buttonandroid:id="@+id/doPost"android:layout_width="fill_parent"android:layout_height="wrap_content"android:padding="10dp"android:layout_marginBottom="10dp"android:text="POST请求"android:onClick="doClick"/><Buttonandroid:id="@+id/doPhoto"android:layout_width="fill_parent"android:layout_height="wrap_content"android:padding="10dp"android:layout_marginBottom="10dp"android:text="拍照"android:onClick="doPhoto"/><ImageViewandroid:id="@+id/showPhoto"android:layout_width="fill_parent"android:layout_height="250dp"android:scaleType="centerCrop"android:src="@drawable/add"android:layout_marginBottom="10dp"/><TextViewandroid:id="@+id/showContent"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"/></LinearLayout></ScrollView>
</LinearLayout>

由于我现在对Java 还不是很熟悉,只看过一些视频教程,实际开发经验不多,我按自己的理解写的注释,不过应该不会有什么太大问题吧,如有错误请指出,谢谢!

转载于:https://www.cnblogs.com/zhouzme/p/5758513.html

Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件相关推荐

  1. Android 利用an框架快速实现网络请求(含下载上传文件)

    作者:Bgwan 链接:https://zhuanlan.zhihu.com/p/22573081 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. an框架的网络框架 ...

  2. java string 包含http_Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)...

    一.HttpPost上传文件 public static String getSuffix(final MultipartFile file){ if(file == null || file.get ...

  3. 解决python发送multipart/form-data请求上传文件的问题

    解决python发送multipart/form-data请求上传文件的问题 参考文章: (1)解决python发送multipart/form-data请求上传文件的问题 (2)https://ww ...

  4. java 转发上传文件_Java 发送http请求上传文件功能实例

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package wxapi.WxHelper; import java.io.BufferedReader; import java.io.Dat ...

  5. Android中使用retrofit2进行网络get请求查询数据和post请求上传文件

    场景 Retrofit2 Retrofit 是对 OkHttp 的封装,是主流的网络框架. 适用于Android 和 Java 的类型安全的HTTP客户端,由Square提供的. Retrofit是一 ...

  6. 爬虫实战学习笔记_4 网络请求urllib3模块:发送GET/POST请求实例+上传文件+IP代理+json+二进制+超时

    1 urllib3模块简介 urllib3是一个第三方的网络请求模块(单独安装该模块),在功能上比Python自带的urllib强大. 1.1了解urllib3 urllib3库功能强大,条理清晰的用 ...

  7. java发送post请求上传文件和json数据

    java发送post请求上传文件和json数据 因为第三方的上传服务post参数使用了两个@requestpart参数. 但是feign不可以使用两个@requestpart参数.会报错:java.l ...

  8. java怎么上传文件到web服务器_Java客户端通过Http发送POST请求上传文件到web服务器...

    http://www.cnblogs.com/WilliamJiang/archive/2012/04/29/2475883.html 1.朋友的一个需求,让我给他实现,需求是这样的,需要用ASP.n ...

  9. python的requests库发送携带上传文件的接口_python requests 库请求带有文件参数的接口实例...

    python requests 库请求带有文件参数的接口实例 有些接口参数是一个文件格式,比如fiddler 抓包参数如下显示 这个接口的 form-data fiddler 显示的和不带文件参数的接 ...

最新文章

  1. java中hashcode_浅谈Java中的Hash值
  2. PHP——MySQL数据库分页查询
  3. mysql在linux下显示花_在Linux 中搭建 Mysql
  4. Android之 FLAG_ACTIVITY_CLEAR_TASK
  5. 图解exports 和 module.exports
  6. Docker(四) Dockerfile 详解
  7. python和lua哪个有前途_lua、python对比学习
  8. Mysql Oracle Tidb对空值的处理
  9. linux opencv移植教程,OpenCV在Ubuntu和Linux系统下的移植
  10. Leetcode: Reorder List Summary: Reverse a LinkedList
  11. 谁与争锋|神龙三代,集大成而来!
  12. Html5 学习系列(三)增强型表单标签
  13. 关于PWM调速(基础篇)
  14. 解读微信多开技巧,Python tk 实现微信多开脚本exe工具
  15. 7行代码让B站崩溃3小时,竟因“一个诡计多端的0”
  16. Xilinx AXI Crossbar相关调试记录
  17. 云会议玩法升级:从免费午餐到高价值付费
  18. 学习使用junit进行单元测试,
  19. uView JS工具库
  20. nexues vpc 角色切换,引起staick 重置引起业务中断问题

热门文章

  1. 12505 java_Java jdbc Oracle error: ORA 12505
  2. 月薪2w的00后女财务,靠这套报表模板征服了老板
  3. trunk口_Trunk的概念与设置
  4. serversocket 返回浏览器图片_深入理解浏览器的缓存机制
  5. python的常量和变量_python中的常量和变量代码详解
  6. hnu暑期实训之日历问题
  7. hnu暑期实训之487-3279 字符串处理
  8. 基于AUTOSAR的AP平台的应用开发
  9. 周期(KMP算法之Next数组的性质)
  10. ~~线性筛法求素数(附模板题)