`

Android中http请求(C# MVC接收)

阅读更多

 

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# MVC移动开发demo

    在IT行业中,C# MVC(Model-View-Controller)框架被广泛用于构建高效、可维护的Web应用程序。这个“C# MVC移动开发demo”显然旨在展示如何利用C# MVC技术来开发针对移动设备的应用程序。下面我们将深入探讨C# MVC...

    Android 连接C# SQLserver

    这些服务接收来自Android客户端的请求,并处理与SQL Server数据库的交互。C#提供了强大的ADO.NET框架,允许开发者方便地连接、查询和操作SQL Server数据库。使用SqlCommand对象执行SQL语句,SqlDataReader读取结果,...

    android 上传文件至C#服务器

    在Android中,你可以使用`HttpURLConnection`或`OkHttp`库来发起HTTP请求,实现文件的POST方式上传。通常,你需要创建一个`MultipartEntity`或使用`RequestBody`(对于OkHttp)来封装文件和额外的数据,如文件名、...

    MVC架构 学习Demo

    MVP与MVC类似,也是一种分层架构,但在Android或Java开发中更为常见。在MVP模式中,Presenter作为模型和视图的中间人,负责协调两者间的交互。这有助于在Android环境中实现更清晰的代码组织和更好的测试能力。 1. *...

    android客户端上传文件源码,struts2服务端接收源码 .zip

    总结来说,这个源码包展示了Android客户端如何使用HTTP POST请求上传文件到Struts2服务端,以及服务端如何接收和处理这些文件。这涵盖了Android网络编程、文件操作、Struts2框架以及可能的跨平台通信技术。对于学习...

    MVC4.0与MVC汉化包

    3. **控制器(Controller)**:控制器接收来自用户的请求,处理这些请求,与模型进行交互,然后选择适当的视图来显示结果。控制器是业务逻辑和用户界面之间的桥梁。 **ASP.NET MVC 4.0的新特性** 1. **移动支持**...

    android客户端上传文件源码,struts2服务端接收源码。.zip

    关于标签中提到的"C#",虽然本场景主要涉及的是Android和Struts2,但C#通常用于Windows应用开发或ASP.NET Web应用。在ASP.NET中,类似地,可以使用`HttpPostedFileBase`类来接收上传的文件,并通过`SaveAs()`方法将...

    安卓Android源码——android与asp.net中的一般处理程序ashx进行交互.zip

    本资源"安卓Android源码——android与asp.net中的一般处理程序ashx进行交互.zip"提供了一个实例,展示了如何让Android客户端与ASP.NET服务器端通过HTTP协议进行数据交换。让我们深入探讨这个过程涉及的关键知识点。 ...

    安卓Android源码——与asp.net中的一般处理程序ashx进行交互.zip

    在ASHX文件中,你可以编写C#代码来接收Android客户端发送的请求,处理数据,然后返回JSON响应。 总结一下,这个压缩包提供的源码示例展示了如何在Android客户端使用HttpURLConnection与ASP.NET服务器上的ASHX处理...

    C#开发WebService

    通过以上步骤,我们能够实现一个基于 C# 的 WebService,它能有效地将数据库中的数据以 JSON 格式返回给客户端。这种方法简单易行,特别适合于初学者或小型项目。 接下来,我们还可以探索第二种方法:使用 WCF 编写...

    SpringMVC+运行流程解析

    在Spring MVC框架中,DispatcherServlet是整个Web应用的核心控制器,负责接收客户端的请求,并将请求分发到不同的处理组件。整个Spring MVC的请求处理流程如下: 首先,当Web容器(如Tomcat)接收到HTTP请求后,会...

    Android代码-仓库管理系统源码.zip

    Android仓库管理系统源码的核心架构通常采用MVC(Model-View-Controller)模式,这是一种常用的设计模式,能够清晰地分离数据处理、用户界面和控制逻辑。在这个系统中,Model负责数据的存储和处理,View负责展示信息...

    Android学习基本路线指导.

    - 学习C#语言,了解ASP.NET MVC或Web API框架。 4. **Ruby on Rails**: - Ruby on Rails是一种基于Ruby语言的Web开发框架,以其简洁性和开发效率著称。 - 学习Ruby语言基础,掌握Rails框架的核心概念,如...

    ASP.NET-GCM:用于推送通知 GCM 在 Android 中的 ASP.NET 服务器

    2. **服务器API接口**:ASP.NET-GCM项目中,开发者需要实现一个服务器端API,该API接收设备的注册ID,并使用Google的GCM服务器接口发送消息。 3. **GCM服务器API密钥**:在ASP.NET应用中,需要配置一个Google API...

    程序员免费视频大全

    这意味着内容不仅包括基本的Android SDK使用、Activity管理、Intent通信、布局设计,还可能深入到数据库操作、服务、广播接收器、多媒体开发、权限管理、性能优化等方面,并且将这些知识与实际项目开发的实践经验相...

    uniapp利用unipush+个推sdk服务端实现,后端代码是整合Thinkphp+RestAPI V2(完整版)

    uniapp是一款跨平台的移动应用开发框架,它允许开发者用一套代码库来创建iOS、Android、H5以及小程序等多个平台的应用。而unipush则是uniapp提供的一个集成推送服务,通过与个推SDK的结合,可以实现高效稳定的推送...

    手机预定.net源码

    开发者可能使用ASP.NET MVC或ASP.NET Core来构建Web API服务,这些服务可以接收来自移动应用的HTTP请求,执行预订操作,然后返回相应的结果。 支付功能是此源码中的关键部分,它意味着系统集成了支付网关,如支付宝...

    teamtalk源码及安装手册

    - 使用苹果的SDK进行网络通信,可能涉及到Bonjour(本地网络发现)、HTTP/HTTPS请求或者自定义TCP/IP协议栈。 - IM功能实现,包括消息发送、接收、离线消息存储、推送通知等。 3. **Android客户端**: - Android...

    采用Bitmap+Graphics 动态的生成柱形图,可以静态化传值 也可动态的读库。

    这部分负责接收用户的请求,调用后台生成柱形图的逻辑,并将生成的图像以HTTP响应的形式返回给用户,展示在网页上。 综上所述,这个项目的核心在于利用Bitmap和Graphics类动态生成柱形图,并结合Web技术实现数据的...

    Ecommerce

    C#提供了HTTP客户端库,可以方便地发送请求和接收响应,实现支付接口的调用。 4. **安全性**:C#提供内置的安全特性,如身份验证、授权和加密,对于处理敏感的交易信息至关重要。开发者可以利用这些功能确保用户的...

Global site tag (gtag.js) - Google Analytics