- 浏览: 660931 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
Android 开发中很多涉及网络通信,因为项目中涉及过一次,当时实现方式是 Http 请求,服务器端为 C# MVC 实现,所以这里想对这种方式进行一个总结。
Android 客户端:
首先封装一个 Http 请求帮助类
HttpHelper.java
package com.iflytek.leting.net; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.CookieStore; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import android.util.Log; public abstract class HttpHelper { private final static String TAG = "HttpHelper"; private final static String SERVER_URL = "http://10.0.0.3/Test/"; private static CookieStore cookieStore; /** * @descrption 上传可变参数的Http请求方法 * @author xdwang * @create 2012-9-27下午8:06:28 * @param controllerName C# MVC中的controller * @param actionName C# MVC中的action * @param params 可变参数 * @return */ public static String invoke(String controllerName, String actionName, List<NameValuePair> params) { String result = null; try { String url = SERVER_URL + controllerName + "/" + actionName + "/"; Log.d(TAG, "url is" + url); HttpPost httpPost = new HttpPost(url); if (params != null && params.size() > 0) { HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8"); httpPost.setEntity(entity); } DefaultHttpClient httpClient = new DefaultHttpClient(); // 添加Cookie if (cookieStore != null) { httpClient.setCookieStore(cookieStore); } HttpResponse httpResponse = httpClient.execute(httpPost); StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( httpResponse.getEntity().getContent())); for (String s = reader.readLine(); s != null; s = reader.readLine()) { builder.append(s); } result = builder.toString(); Log.d(TAG, "result is ( " + result + " )"); // 保存Cookie cookieStore = ((AbstractHttpClient) httpClient).getCookieStore(); } catch (Exception e) { Log.e(TAG, e.toString()); } Log.d(TAG, "over"); return result; } public static String invoke(String controllerName, String actionName) { return invoke(controllerName, actionName, null); } /** * @descrption 通过拼接的方式构造请求内容,实现参数传输以及文件传输 * @author xdwang * @create 2012-9-27下午7:06:20 * @param controllerName * .NETMVC中的controllerName * @param actionName * .NETMVC中的actionName * @param params * key:为C#方法接受的参数,value为参数值,支持多个参数 * @param files * key:为C#方法接受的参数,不要重复,value为参数值,支持上传多个附件 * @return * @throws IOException */ public static String httpPostByte(String controllerName, String actionName, Map<String, String> params, Map<String, byte[]> 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"; String url = SERVER_URL + controllerName + "/" + actionName + "/"; URL uri = new URL(url); 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, byte[]> file : files.entrySet()) { StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name=\"" + file.getKey() + "\"; filename=\"" + file.getKey() + "\"" + LINEND); sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND); sb1.append(LINEND); outStream.write(sb1.toString().getBytes()); //这里如何是File对象,则写成这种形式 // 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); // } outStream.write(file.getValue()); // is.close(); outStream.write(LINEND.getBytes()); } } // 请求结束标志 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); // 得到响应码 int res = conn.getResponseCode(); InputStream in = null; if (res == 200) { in = conn.getInputStream(); int ch; StringBuilder sb2 = new StringBuilder(); while ((ch = in.read()) != -1) { sb2.append((char) ch); } } return in == null ? null : in.toString(); } }
Android 中的调用:
AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() { /** * 服务器端的返回值处理 */ @Override protected void onPostExecute(String result) { Log.d(TAG, result); try { JSONObject json = new JSONObject(result); uuid = json.getString("Result"); String picName = ""; String picSrc = ""; JSONObject picMap = json.getJSONObject("Message"); if (json.getJSONObject("Message") != null) { picSrc = picMap.getString("Value"); picName = picMap.getString("Key"); } } catch (JSONException e) { Log.e(TAG, e.toString()); } } @Override protected void onPreExecute() { super.onPreExecute(); } /** * 调用Http方法请求服务器端 */ @Override protected String doInBackground(Void... arg0) { try { // 直接传普通参数; NameValuePair param = new BasicNameValuePair("uuid", uuid); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(param); return HttpHelper.invoke("GuessPic", "GetNextPicture", params); // 直接传普通参数和附件; Map<String, String> params = new HashMap<String, String>(); params.put("content", contentTemp); params.put("usId", guessPicture.usId); Map<String, byte[]> files = new HashMap<String, byte[]>(); files.put("soundBytes", totalBytes); return HttpHelper.httpPostByte("GuessPic", "SaveAudio", params, files); } catch (Exception e) { Log.e(TAG, e.toString()); return null; } } }; task.execute();
服务器端(C#MVC实现):
/// <summary> /// 下一张图片 /// </summary> /// <returns></returns> public JsonResult GetNextPicture(string uuid) { ResultMessage<string, KeyValuePair<string, string>> rm = new ResultMessage<string, KeyValuePair<string, string>>(); //….TODO逻辑处理 return Json(rm, JsonRequestBehavior.AllowGet); }
/// <summary> /// 保存上传一个文件和内容 /// </summary> /// <param name="content">内容</param> /// <param name="soundBytes">音频文件对象</param> /// <returns></returns> public JsonResult SaveAudio(string content, HttpPostedFileBase soundBytes, string usId) { ResultMessage<bool, object> rm = new ResultMessage<bool, object>(); byte[] bytes = new byte[soundBytes.InputStream.Length]; soundBytes.InputStream.Read(bytes, 0, bytes.Length); //….TODO逻辑处理 return Json(rm, JsonRequestBehavior.AllowGet); }
发表评论
-
C# 可选参数和命名参数
2013-09-05 22:39 1078不说废话,直接上代码 using Syste ... -
This version of ADT requires android SDK
2013-07-25 16:45 1531Windows系统下用Eclipse开发工具开发An ... -
C#中JSON序列化和反序列化
2012-12-13 09:33 2633在做项目中使用EF时,发现DataContractJsonSe ... -
Android学习13-----网络通信(4) WebView组件
2012-11-27 09:18 2447WebView 是一个开发的浏览 ... -
Android学习13-----网络通信(3) 与Web Service进行通讯
2012-11-26 09:40 1849这里我们的WebService使用xFire开发。 ... -
Android学习13-----网络通信(2) 与Socket交换数据
2012-11-23 09:11 3259对于网络开发而言,最常用的交互模式:WebService、We ... -
Android学习13-----网络通信(1) 与WEB服务器交换数据
2012-11-22 09:11 2152与Web服务器交互: 如果手机要想与 web ... -
Android学习11-----多媒体技术(5) 媒体录制
2012-11-16 08:10 1838在Android中通过android.media ... -
Android学习11-----多媒体技术(4) 使用摄像头拍照,多点触控
2012-11-15 08:37 2823一、摄像头拍照 前面说媒体播放 时了解了 ... -
Android学习11-----多媒体技术(3) 媒体播放
2012-11-14 08:25 1370在 Androi ... -
Android学习11-----多媒体技术(2) Animation
2012-11-13 08:47 1948一、渐变动画, Tweened Animation ... -
Android学习11-----多媒体技术(1) 绘制简单图形,Bitmap,Matrix
2012-11-12 08:48 1554一、绘制简单图 ... -
Android学习12-----手机服务(4) 传感器
2012-11-19 09:13 1982传感器一般用于游戏中,在 Android 系统中为 ... -
Android学习12-----手机服务(1) 取得电池电量和声音服务:AudioManager
2012-11-18 11:18 3414一、取得电池电量信息 ... -
Android学习10-----Android组件通信 (8) 桌面显示组件:AppWidget
2012-11-02 08:36 1984一、 AppWidget 在使用 Androi ... -
Android学习10-----Android组件通信 (7) 广播机制:Broadcast
2012-11-01 08:43 1471一、 广播: 广播也是一种信息的发送机制,在 ... -
Android学习10-----Android组件通信 (6) PendingIntent
2012-10-31 08:20 2196Intent 的主要功能是表示用 ... -
Android学习10-----Android组件通信 (5) Service
2012-10-30 08:25 1665Service 基本组成: ... -
Android学习10-----Android组件通信 (4) 消息机制
2012-10-29 08:22 1502在 Android 操作系统中存在着消息队列的操作 ... -
Android学习10-----Android组件通信 (3) ActivityGroup
2012-10-26 08:23 2258导航栏在 Android 中的应用是很常见的,前面 ...
相关推荐
C# MVC ajax调用api接口,api接口以List的形式接收参数,以实现多条记录的操作,以VS2013打开,ASP.NET MVC 4,下载解压rar-demo直接打开运行即可。压缩文件里也包含了“IHttpActionResult不识别解决办法”的文档以...
C#-HTTP请求接收(Post数据流,GET,表单)
C#MVC控制器前后端传值
该文档旨在介绍基于MVC的架构开发时的线程及并发的使用方式及常用的案例,供大家学习。 对于Web开发,我想本文的知识点应该足够,如果后面有遇到本文没讲的,后面再补充吧。
C# MVC入门实例 MVC留言本 C# MVC入门实例 MVC留言本
C# MVC 过滤器防止SQL注入
C# MVC三层数据操作实例 C# MVC三层数据操作实例
c# mvc基础框架+前端layui.js+sqlsugar处理数据(支持sql server、mysql、sqlite、Oracle)。 用户,角色和页面配置齐全,容易上手,非常适合小微型项目开发。
MVC简单例子C#,简单易懂 MVC简单例子C#,简单易懂 MVC简单例子C#,简单易懂
C# mvc websocket 在线聊天实例
Newtonsoft.Json C# MVC中json对象,json字符串 处理 2.0版3.5版4.0版4.5版,综合以上历史版本,并且有源码。测试可以运行。
C# 写的经典框架,C#的文件上传,添加水印,创建缩略图等功能~~~
c# mvc 导出excel 参考参考吧
C# MVC开发框架,适合学习,适合二次开发,欢迎下载。VS2013 SQL:2008R2
基于C# MVC开发的WEB API通用框架 附带 微信 支付宝支付集成 基于C# MVC开发的WEB API通用框架 附带 微信 支付宝支付集成 基于C# MVC开发的WEB API通用框架 附带 微信 支付宝支付集成
基于C#的停车管理系统,用MVC结构,开发工具VS2017数据库SQL server2012
权限管理页面、包括用户管理、角色管理、权限管理等页面,可以直接使用,有什么问题可以私聊我,我都可以帮忙解决,期待大家的下载使用。
C#基于MVC的博客系统源码.zip
c# rest http请求类库c# rest http请求类库c# rest http请求类库