Android http 通信



为了方便大家学习,工程代码以打包上传,http://download.csdn.net/detail/devintt/8029549

HTTP通信分两种形式:GETPOST

GET

优点:只需要在URL设置参数就可以进行对服务器的访问,比较方便。

缺点:但是传输的参数不得大于2kb,而且参数公开可查看。

POST

优点:传输参数可大于2kb,参数不可查看,相对安全。

缺点:需要用List<NameValuePair>进行打包。

使用的是安卓sdk自带的org.apache.http

注意:

安卓2.3版本开始,通信线程需要和UI线程分开,不然会造成线程阻塞,所以把HTTP通信的代码写在一个Thread类里面。


void run() {
		HttpRunner jsonParser = new HttpRunner();
		String json = jsonParser.makeHttpPOST(httpUrl, params);
		Message msg = new Message();
		switch (type) {
		case POST: 
			msg.what = POST;
			break;
		default:
			break;
		}
		msg.obj = json;
		handler.sendMessage(msg);
	}


HTTP通信的时候会造成UI线程的停滞,为了避免这种情况而造成横的UI线程崩溃,所以我们将HTTP线程交给后台运行,并且需要用一个Handler将通信得到的消息打包发送到Activity里面。Activity里面也需要Handler将消息接收。

示例代码:

/************************** msg接收 *************************/

		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				switch (msg.what) {
				case HttpThreadPost.POST:
					result = (String) msg.obj;
					pDialog.dismiss();
					result = myJsonFormatTool.formatJson(result, "  ");
					debugDialog(result);
					break;
				case HttpThreadGet.GET:
					result = (String) msg.obj;
					pDialog.dismiss();
					result = myJsonFormatTool.formatJson(result, "  ");
					debugDialog(result);
					break;
				case HttpThreadGet.GETIMG:
					result = (String) msg.obj;
					pDialog.dismiss();
					debugDialog(result);
					break;
				default:
					break;
				}
			}
		};

主要的实现HTTP通信代码:

实现HTTP通信我们新建一个类,里面有两个方法,postget。将URLparams传递进去,进行通信。实现代码和java基本一致。

示例代码:

// post数据
	public String makeHttpPOST(String url, List<NameValuePair> params) {
		// Making HTTP request
		jsonString = "";
		try {
			// defaultHttpClient
			DefaultHttpClient httpClient = new DefaultHttpClient();
			// 请求超时,60秒
			httpClient.getParams().setParameter(
					CoreConnectionPNames.CONNECTION_TIMEOUT, 3 * 60 * 1000);
			HttpPost httpPost = new HttpPost(url);
			httpPost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
			HttpResponse httpResponse = httpClient.execute(httpPost);
			HttpEntity httpEntity = httpResponse.getEntity();
			if (httpResponse.getStatusLine().getStatusCode() != 200) {
				jsonString = "ERROR: Status Code "
						+ httpResponse.getStatusLine().getStatusCode();
				return jsonString;
			}
			is = httpEntity.getContent();

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		} catch (IOException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		}

		try {
			BufferedReader reader = new BufferedReader(
					new InputStreamReader(is));
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line);
			}
			is.close();
			jsonString = sb.toString();
			Log.d("json数据", jsonString);
		} catch (Exception e) {
			Log.e("Buffer Error", "Error converting result " + e.toString());
			jsonString = "ERROR:" + e.toString();
		}

		// return JSON String
		return jsonString;
	}

	// get数据
	public String makeHttpGET(String url) {
		jsonString = "";
		// Making HTTP request
		Log.d("http请求", url);
		try {
			// defaultHttpClient
			DefaultHttpClient httpClient = new DefaultHttpClient();
			// 请求超时,2*60 * 1000秒
			httpClient.getParams().setParameter(
					CoreConnectionPNames.CONNECTION_TIMEOUT, 60 * 1000);
			HttpGet httpRequest = new HttpGet(url);

			HttpResponse httpResponse = httpClient.execute(httpRequest);
			HttpEntity httpEntity = httpResponse.getEntity();
			if (httpResponse.getStatusLine().getStatusCode() != 200) {
				jsonString = "ERROR: Status Code "
						+ httpResponse.getStatusLine().getStatusCode();
				return jsonString;
			}
			is = httpEntity.getContent();

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		} catch (IOException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		}

		try {
			BufferedReader reader = new BufferedReader(
					new InputStreamReader(is));
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line);
			}
			is.close();
			jsonString = sb.toString();
			Log.d("json数据", jsonString);
		} catch (Exception e) {
			Log.e("Buffer Error", "Error converting result " + e.toString());
			jsonString = "ERROR:" + e.toString();
		}

		// return JSON String
		return jsonString;
	}

	// get图片
	public byte[] makeImgHttpGET(String url) {
		jsonString = "";
		// Making HTTP request
		Log.d("http请求", url);
		try {
			// defaultHttpClient
			DefaultHttpClient httpClient = new DefaultHttpClient();
			// 请求超时,2*60 * 1000秒
			httpClient.getParams().setParameter(
					CoreConnectionPNames.CONNECTION_TIMEOUT, 60 * 1000);
			HttpGet httpRequest = new HttpGet(url);

			HttpResponse httpResponse = httpClient.execute(httpRequest);
			HttpEntity httpEntity = httpResponse.getEntity();
			if (httpResponse.getStatusLine().getStatusCode() != 200) {
				jsonString = "Status Code:"
						+ httpResponse.getStatusLine().getStatusCode();
				return null;
			}
			is = httpEntity.getContent();

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		} catch (IOException e) {
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		}

		ByteArrayOutputStream outstream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = -1;
		try {
			while ((len = is.read(buffer)) != -1) {
				outstream.write(buffer, 0, len);
			}
			outstream.close();
			is.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			jsonString = "ERROR:" + e.toString();
		}

		// return JSON String
		return outstream.toByteArray();
	}


最后在AndroidManifest.xml加上权限

<uses-permission android:name="android.permission.INTERNET"/>


一个android HTTP接口测试小软件,可以GET和POST,参数可以动态添加删除,结果自动格式化json,里面也有GET图片的代码,但功能还没加上去。

为了方便大家学习,工程代码以打包上传,http://download.csdn.net/detail/devintt/8029549

本人是初学者,第一次发一下自己做过的记录,有问题请大大们指教一下,谢谢!~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值