- 浏览: 238372 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xchd:
分别在什么时候(情况下)用ThreadFactory、Exec ...
Executor线程池实例 -
mikey_5:
是不是没有写完啊
Executor线程池实例 -
xinyao:
楼主,你好,请问能给我发个源码吗,我要在一个页面能实时看到下载 ...
Android学习系列(19)--App离线下载 -
sdtzkj:
...
jasperReport 帮助文档 api -
shero_ys:
public class VrowsePicActivity ...
android handler 实现三步曲
Android中发送Http请求实例(包括文件上传、servlet接收)
http, post, 上传文件
本帖最后由 xinke7hao 于 2010-6-12 13:43 编辑
前天开始要准备实现手机端往服务器传参数,还要能传附件,找了不少文章和资料,现在总结一下分享分享:代码中的catch什么的就省略了,尝试了图片、txt、xml是没问题的.. 各位 尽情拍砖吧。
发完发现代码部分的格式……这个编辑器不太会用,怎么感觉把换行都去掉了,处理好换行缩进也……
首先我是写了个java工程测试发送post请求:可以包含文本参数和文件参数****************************************************
/** * 通过http协议提交数据到服务端,实现表单提交功能,包括上传文件 * @param actionUrl 上传路径 * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */ public static void postMultiParams(String actionUrl, Map<String, String> params, FormBean[] files) { try { PostMethod post = new PostMethod(actionUrl); List<art> formParams = new ArrayList<art>(); for(Map.Entry<String, String> entry : params.entrySet()){ formParams.add(new StringPart(entry.getKey(), entry.getValue())); } if(files!=null) for(FormBean file : files){ //filename为在服务端接收时希望保存成的文件名,filepath是本地文件路径(包括了源文件名),filebean中就包含了这俩属性 formParams.add(new FilePart("file", file.getFilename(), new File(file.getFilepath()))); } Part[] parts = new Part[formParams.size()]; Iterator<art> pit = formParams.iterator(); int i=0; while(pit.hasNext()){ parts[i++] = pit.next(); } //如果出现乱码可以尝试一下方式 //StringPart sp = new StringPart("TEXT", "testValue", "GB2312"); //FilePart fp = new FilePart("file", "test.txt", new File("./temp/test.txt"), null, "GB2312" //postMethod.getParams().setContentCharset("GB2312"); MultipartRequestEntity mrp = new MultipartRequestEntity(parts, post.getParams()); post.setRequestEntity(mrp); //execute post method HttpClient client = new HttpClient(); int code = client.executeMethod(post); System.out.println(code); } catch ... } 复制代码 通过以上代码可以成功的模拟java客户端发送post请求,服务端也能接收并保存文件 java端测试的main方法: public static void main(String[] args){ String actionUrl = "http://192.168.0.123:8080/WSserver/androidUploadServlet"; Map<String, String> strParams = new HashMap<String, String>(); strParams.put("paramOne", "valueOne"); strParams.put("paramTwo", "valueTwo"); FormBean[] files = new FormBean[]{new FormBean("dest1.xml", "F:/testpostsrc/main.xml")}; HttpTool.postMultiParams(actionUrl,strParams,files); } 复制代码 本以为大功告成了,结果一移植到android工程中,编译是没有问题的。 但是运行时抛了异常 先是说找不到PostMethod类,org.apache.commons.httpclient.methods.PostMethod这个类绝对是有包含的; 还有个异常就是VerifyError。 开发中有几次碰到这个异常都束手无策,觉得是SDK不兼容还是怎么地,哪位知道可得跟我说说~~ 于是看网上有直接分析http request的内容构建post请求的,也有找到带上传文件的,拿下来运行老是有些问题,便直接通过运行上面的java工程发送的post请求,在servlet中打印出请求内容,然后对照着拼接字符串和流终于给实现了!代码如下: *********************************************************** /** * 通过拼接的方式构造请求内容,实现参数传输以及文件传输 * @param actionUrl * @param params * @param files * @return * @throws IOException */ public static String post(String actionUrl, Map<String, String> params, Map<String, File> files) throws IOException { String BOUNDARY = java.util.UUID.randomUUID().toString(); String PREFIX = "--" , LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; String CHARSET = "UTF-8"; URL uri = new URL(actionUrl); HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); conn.setReadTimeout(5 * 1000); // 缓存的最长时间 conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); // 首先组拼文本类型的参数 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND); sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND); sb.append("Content-Transfer-Encoding: 8bit" + LINEND); sb.append(LINEND); sb.append(entry.getValue()); sb.append(LINEND); } DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); outStream.write(sb.toString().getBytes()); // 发送文件数据 if(files!=null) for (Map.Entry<String, File> file: files.entrySet()) { StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""+file.getKey()+"\""+LINEND); sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND); sb1.append(LINEND); outStream.write(sb1.toString().getBytes()); InputStream is = new FileInputStream(file.getValue()); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); } is.close(); outStream.write(LINEND.getBytes()); } //请求结束标志 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); // 得到响应码 int res = conn.getResponseCode(); if (res == 200) { InputStream in = conn.getInputStream(); int ch; StringBuilder sb2 = new StringBuilder(); while ((ch = in.read()) != -1) { sb2.append((char) ch); } } outStream.close(); conn.disconnect(); return in.toString(); } 复制代码 ********************** button响应中的代码: ********************** public void onClick(View v){ String actionUrl = getApplicationContext().getString(R.string.wtsb_req_upload); Map<String, String> params = new HashMap<String, String>(); params.put("strParamName", "strParamValue"); Map<String, File> files = new HashMap<String, File>(); files.put("tempAndroid.txt", new File("/sdcard/temp.txt")); try { HttpTool.postMultiParams(actionUrl, params, files); } catch ... 复制代码 *************************** 服务器端servlet代码: *************************** public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //print request.getInputStream to check request content //HttpTool.printStreamContent(request.getInputStream()); RequestContext req = new ServletRequestContext(request); if(FileUpload.isMultipartContent(req)){ DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload fileUpload = new ServletFileUpload(factory); fileUpload.setFileSizeMax(FILE_MAX_SIZE); List items = new ArrayList(); try { items = fileUpload.parseRequest(request); } catch ... Iterator it = items.iterator(); while(it.hasNext()){ FileItem fileItem = (FileItem)it.next(); if(fileItem.isFormField()){ System.out.println(fileItem.getFieldName()+" "+fileItem.getName()+" "+new String(fileItem.getString().getBytes("ISO-8859-1"),"GBK")); } else { System.out.println(fileItem.getFieldName()+" "+fileItem.getName()+" "+ fileItem.isInMemory()+" "+fileItem.getContentType()+" "+fileItem.getSize()); if(fileItem.getName()!=null && fileItem.getSize()!=0){ File fullFile = new File(fileItem.getName()); File newFile = new File(FILE_SAVE_PATH+fullFile.getName()); try { fileItem.write(newFile); } catch ... } else { System.out.println("no file choosen or empty file"); } } } } } public void init() throws ServletException { //读取在web.xml中配置的init-param FILE_MAX_SIZE = Long.parseLong(this.getInitParameter("file_max_size"));//上传文件大小限制 FILE_SAVE_PATH = this.getInitParameter("file_save_path");//文件保存位置 }
发表评论
-
Android学习系列(19)--App离线下载
2011-08-13 11:40 1403Android学习系列(19)--App离线下载 ... -
Android学习系列(20)-App数据格式之解析Json
2011-08-13 11:28 1603JSON数据格式,在Android中被广泛运用于客户端和网络( ... -
Android学习系列(1)--为App签名(为apk签名)
2011-08-13 11:20 1683写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐, ... -
Android学习系列(4)--App自适应draw9patch不失真背景
2011-08-13 11:16 2211做人要大度,海纳百川,做事要圆滑,左右逢源,这让我想到了编程也 ... -
Android自定义View之一:初探实例 .
2011-08-13 11:09 1485Android自定义View实现很简单 继承View,重写构 ... -
Android多媒体学:播放网络上的视频 .
2011-08-13 11:05 2068Android支持播放网络上的视频。在播放网络上的视频时,牵涉 ... -
Android多媒体学:利用AudioRecord类实现自己的音频录制程序 .
2011-08-13 11:02 5876AudioRecord类相对于MediaRecorder来说, ... -
Android多媒体:实现图像的编辑和合成 .
2011-08-13 10:59 2165package demo.camera; import ja ... -
自动完成框
2011-05-03 13:44 742请下载源码 -
读取sd卡照片
2011-05-03 13:43 1306请下载源码 -
UC菜单栏布局
2011-05-03 13:41 1125请下载附件 -
Executor线程池实例
2011-04-06 17:42 6679Executor 是 java5 下的一个 ... -
android handler 实现三步曲
2011-04-06 16:59 1435一. 要实现接口: public class VrowseP ... -
android 横竖屏切换
2011-03-25 14:33 1934①不理会。。②只竖屏 ... -
android 分辨率调试
2011-03-25 13:36 1867一:不同的layout Android ... -
android 图片内存溢出
2011-03-21 18:24 3087我的代码如下 is = new FileI ... -
android Exid 不可修改
2011-03-21 13:47 1260Android:只读EditText内容可滚动(禁止输入法)的 ... -
android 对话提示框大全
2011-03-21 12:34 3191Android 对话框(Dialog)大全 建立你自己的对话框 ... -
Android消息提示框和对话框
2011-03-21 12:29 1363在某些情况下需要向用户弹出提示消息,如显示错误信息,收到短消息 ... -
android tab 用法
2011-03-11 15:10 1751TabHost广泛运用于android程序中,在程序中运用Ta ...
相关推荐
在实际开发中,你可能还需要处理异常,如网络不可用、超时等问题,并且为了提高性能和用户体验,通常会使用异步方式发送请求,例如使用`AsyncTask`或者集成第三方网络库。 在"TestHttpPost"项目中,你应该能看到一...
首先,我们要明白,在Android系统中发送短信涉及到对特定权限的请求。 在AndroidManifest.xml文件中,我们需要添加以下权限: ```xml <uses-permission android:name="android.permission.SEND_SMS" /> ``` `SEND_...
现在,你可以在需要发送请求的地方调用`NetUtil.sendRequest`,传入相应的参数和回调。例如,从服务器获取JSON数据并解析: ```java NetUtil.sendRequest("http://api.example.com/data", RequestMethod.GET, null,...
例如,你可以创建一个HttpClient实例,然后使用HttpGet或HttpPost对象来指定URL,设置请求参数,最后执行execute方法来发送请求。然而,HttpClient自Android 6.0(API级别23)开始被弃用,因为它的维护成本较高,且...
总结来说,Android发送POST请求获取JSON字符串涉及到网络请求的实现、参数封装、请求发送、JSON解析以及错误处理等多个环节。选择合适的网络库能提高效率,而合理处理服务器返回的数据则能提升用户体验。在实际项目...
在这个实例中,我们将深入理解 Android 中 HTTP 请求的实现方式,以及如何在 Android Studio 中整合这些功能。 1. **网络请求库的选择**:Android Studio 项目通常会使用第三方库如 Volley、Retrofit 或 OkHttp 来...
这个“Android串口通信实例”项目是基于Android Studio的一个实战项目,已经过测试,能够有效地执行串口的各种操作,如配置、开启、发送和接收数据。下面将详细讲解Android串口通信的相关知识点。 1. **Android串口...
设置HTTP请求使用的方法:conn.setRequestMethod("GET"); 设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头 conn.setConnectTimeout(6*1000); 获取服务器的响应码并进行判断,正确的响应码一般为200...
在Android应用开发中,网络请求是必不可少的一部分,用于获取服务器数据、更新应用内容等。本教程将深入探讨如何使用两种常见的网络请求库:HttpURLConnection和AsyncHttpClient,它们都是Android平台上的核心组件,...
在Android应用开发中,HTTP请求是与服务器进行数据交互的基础,包括发送GET、POST等请求类型,获取JSON、XML等格式的数据。为了提高代码的可重用性和可维护性,通常会将HTTP请求进行封装,形成一个独立的网络模块。...
然后,使用HttpClient发送请求,并捕获可能的异常,例如SocketTimeoutException,用于处理请求超时: ```java HttpClient httpClient = new DefaultHttpClient(); try { HttpResponse response = httpClient....
使用OkHttp,你可以创建一个OkHttpClient实例,然后通过调用newRequest()方法创建请求对象,最后调用execute()或enqueue()发送请求。 ```java OkHttpClient client = new OkHttpClient(); Request request = new ...
首先,为了在Android应用中发送邮件,我们需要一个名为`MailSenderActivity`的类来处理邮件的发送逻辑。这个类通常会包含设置SMTP服务器信息、邮件内容、收件人地址等步骤。以下是实现这一功能所需的关键知识点: 1...
在这个实例中,可能使用了`HttpURLConnection`或`OkHttp`这样的网络库,通过HTTP请求向WebService发送查询请求,获取JSON或XML格式的天气数据。 其次,是数据解析。从WebService获取的数据通常是结构化的,我们需要...
在这个类中,定义了一个URL(`http://120.27.23.105/product/getCarts`),用于向服务器发送请求来获取购物车信息。使用了一个`HashMap`来存储请求参数,如用户ID(`uid`)。`verifySelectCarInfo`方法接收用户ID和...
在本文中,我们将深入探讨如何在Android中仿照微信实现发送当前位置的功能,结合百度地图API来获取和分享经纬度及位置信息。这个实例源码"bbdingwei"应该包含了所有必要的组件和逻辑,帮助开发者理解这一过程。 ...
在Android开发中,HTTP协议是应用层网络通信的重要方式,用于客户端(比如手机应用)与服务器之间交换数据。本教程将聚焦于使用`HttpClient`库进行GET请求,这是获取远程资源最常见的方式。请注意,本教程不涉及POST...
Android应用的主线程负责UI更新,因此网络请求、数据库操作等耗时任务应在其他线程中进行。实例可能讲解AsyncTask、Handler、Thread或ExecutorService的使用,以及如何避免应用因ANR(应用无响应)问题而崩溃。 六...
使用Android的HttpURLConnection或者第三方库如Retrofit、Volley等发送POST请求,将用户数据传送到服务器。 4. **处理响应**:服务器接收到请求后,可能会返回成功或失败的响应。我们需要解析这个响应(通常是JSON...