android网络编程_ http

Android 如何使用Http协议访问网络

 

     Android使用Http协议访问网络主要有两种方式,一个是使用 java.net.*(标准Java接口),另一个是使用 Org.apache接口。

     java.net.*:中是可以认为是JDK中的java网络处理包,提供了流,Socket,网络协议等常见网络相关类。

     Apache HttpClient:是一个开源项目,功能相对与JDK中的更加完善,可以为客户端提供高效丰富的Http编程支持

 

一:使用java.net包来进行Http协议的网络编程

public class CustomHttpURLConnection {
	private static String TAG = "CustomHttpUrlConnection";
	//代表 客户端与服务器之间的一个Http连接
	private static HttpURLConnection conn;
	
	public CustomHttpURLConnection() {
	}

	/**
	 * 向服务器发送Get请求
	 * @param strUrl 发送Get请求的url地址
	 * @param nameValuePairs get请求参数
	 * @return
	 */
	public static String GetFromWebByHttpUrlConnection(String strUrl,
			NameValuePair... nameValuePairs) {
		String result="";
		try {
			//1.新建Url对象
			URL url = new URL(strUrl);
			//2.获取并设置HttpURLConnection对象
			conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setConnectTimeout(3000);
			conn.setReadTimeout(4000);
			conn.setRequestProperty("accept", "*/*");
			//3.连接服务器
			conn.connect();
			//4.从建立好的连接中获取inputStream
			InputStream stream=conn.getInputStream();
			//5.为了更好的读取inputStream中的数据,包装inputStream
			InputStreamReader inReader=new InputStreamReader(stream);
			BufferedReader buffer=new BufferedReader(inReader);
			//6.开始读取数据
			String strLine=null;
			while((strLine=buffer.readLine())!=null)
			{
				result+=strLine;
			}
			//7.关闭出入流
			inReader.close();
			//8.关闭连接
			conn.disconnect();
			
			return result;
		} catch (MalformedURLException e) {
			Log.e(TAG, "getFromWebByHttpUrlCOnnection:"+e.getMessage());
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			Log.e(TAG, "getFromWebByHttpUrlCOnnection:"+e.getMessage());
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 向服务器发送Post请求
	 * @param strUrl
	 * @param nameValuePairs
	 * @return
	 */
	public static String PostFromWebByHttpURLConnection(String strUrl,
			NameValuePair... nameValuePairs) {
		String result="";
		try {
			URL url = new URL(strUrl);
			conn = (HttpURLConnection) url
					.openConnection();
			// 设置是否从httpUrlConnection读入,默认情况下是true; 
			conn.setDoInput(true);
			// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在   
			// http正文内,因此需要设为true, 默认情况下是false; 
			conn.setDoOutput(true);
			// 设定请求的方法为"POST",默认是GET 
			conn.setRequestMethod("POST");
			//设置超时
			conn.setConnectTimeout(3000);
			conn.setReadTimeout(4000);
			// Post 请求不能使用缓存 
			conn.setUseCaches(false);
			conn.setInstanceFollowRedirects(true);
			// 设定传送的内容类型是可序列化的java对象   
			// (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)  
			conn.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");
			// 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成,
			conn.connect();
			
			InputStream in = conn.getInputStream();
			InputStreamReader inStream=new InputStreamReader(in);
			BufferedReader buffer=new BufferedReader(inStream);
			String strLine=null;
			while((strLine=buffer.readLine())!=null)
			{
				result+=strLine;
			}
			return result;
		} catch (IOException ex) {
			Log.e(TAG,"PostFromWebByHttpURLConnection:"+ ex.getMessage());
			ex.printStackTrace();
			return null;
		}
	}

}

 

 

二:使用Apache HttpClient

 

public class CustomHttpClient {
	private static String TAG = "CustomHttpClient";
	private static final CommonLog log = LogFactory.createLog();
	private static final String CHARSET_UTF8 = HTTP.UTF_8;
	private static final String CHARSET_GB2312 = "GB2312";
	private static HttpClient customerHttpClient;

	private CustomHttpClient() {

	}

	/**
	 * HttpClient post方法
	 * 
	 * @param url
	 * @param nameValuePairs
	 * @return
	 */
	public static String PostFromWebByHttpClient(Context context, String url,
			NameValuePair... nameValuePairs) {
		try {
			List<NameValuePair> params = new ArrayList<NameValuePair>();
			if (nameValuePairs != null) {
				for (int i = 0; i < nameValuePairs.length; i++) {
					params.add(nameValuePairs[i]);
				}
			}
			UrlEncodedFormEntity urlEncoded = new UrlEncodedFormEntity(params,
					CHARSET_UTF8);
			HttpPost httpPost = new HttpPost(url);
			httpPost.setEntity(urlEncoded);
			HttpClient client = getHttpClient(context);
			HttpResponse response = client.execute(httpPost);
			if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				throw new RuntimeException("请求失败");
			}
			HttpEntity resEntity = response.getEntity();
			return (resEntity == null) ? null : EntityUtils.toString(resEntity,
					CHARSET_UTF8);
		} catch (UnsupportedEncodingException e) {
			Log.w(TAG, e.getMessage());
			return null;
		} catch (ClientProtocolException e) {
			Log.w(TAG, e.getMessage());
			return null;
		} catch (IOException e) {
			throw new RuntimeException(context.getResources().getString(
					R.string.httpError), e);
		} 
	}

	public static String getFromWebByHttpClient(Context context, String url,
			NameValuePair... nameValuePairs) throws Exception{
			log.d("getFromWebByHttpClient url = " + url);
		try {
			// http地址
			// String httpUrl =
			// "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";
			StringBuilder sb = new StringBuilder();
			sb.append(url);
			if (nameValuePairs != null && nameValuePairs.length > 0) {
				sb.append("?");
				for (int i = 0; i < nameValuePairs.length; i++) {
					if (i > 0) {
						sb.append("&");
					}
					sb.append(String.format("%s=%s",
							nameValuePairs[i].getName(),
							nameValuePairs[i].getValue()));
				}
			}
			// HttpGet连接对象
			HttpGet httpRequest = new HttpGet(sb.toString());
			// 取得HttpClient对象
			HttpClient httpclient = getHttpClient(context);
			// 请求HttpClient,取得HttpResponse
			HttpResponse httpResponse = httpclient.execute(httpRequest);
			// 请求成功
			if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				throw new RuntimeException(context.getResources().getString(
						R.string.httpError));
			}
			return EntityUtils.toString(httpResponse.getEntity());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(context.getResources().getString(
					R.string.httpError),e);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			log.e("IOException ");
			e.printStackTrace();
			throw new RuntimeException(context.getResources().getString(
					R.string.httpError),e);
		} 	
	}

	/**
	 * 创建httpClient实例
	 * 
	 * @return
	 * @throws Exception
	 */
	private static synchronized HttpClient getHttpClient(Context context) {
		if (null == customerHttpClient) {
			HttpParams params = new BasicHttpParams();
			// 设置一些基本参数
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params, CHARSET_UTF8);
			HttpProtocolParams.setUseExpectContinue(params, true);
			HttpProtocolParams
					.setUserAgent(
							params,
							"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
									+ "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
			// 超时设置
			/* 从连接池中取连接的超时时间 */
			ConnManagerParams.setTimeout(params, 1000);
			/* 连接超时 */
			int ConnectionTimeOut = 3000;
			if (!HttpUtils.isWifiDataEnable(context)) {
				ConnectionTimeOut = 10000;
			}
			HttpConnectionParams
					.setConnectionTimeout(params, ConnectionTimeOut);
			/* 请求超时 */
			HttpConnectionParams.setSoTimeout(params, 4000);
			// 设置我们的HttpClient支持HTTP和HTTPS两种模式
			SchemeRegistry schReg = new SchemeRegistry();
			schReg.register(new Scheme("http", PlainSocketFactory
					.getSocketFactory(), 80));
			schReg.register(new Scheme("https", SSLSocketFactory
					.getSocketFactory(), 443));

			// 使用线程安全的连接管理来创建HttpClient
			ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
					params, schReg);
			customerHttpClient = new DefaultHttpClient(conMgr, params);
		}
		return customerHttpClient;
	}
}

 

 

 

 

 

 

安卓学习笔记42:基于HTTP网络编程 利用URLConnection和HttpClient访问网络资源 阅读详情

相关推荐

Android网络开发:使用Http与现代库的高级技巧

本文还有配套的精品资源,点击获取 简介:本文深入探讨了在Android平台上进行高效网络请求和数据交换的技术和工具。涵盖了基础的网络访问方法、第三方库(如Volley、OkHttp和Retrofit)的选择及其优势、网络权限管理、HTTPS安全机制,以及网络请求的最佳实践。学习这些内容可以帮助开发者构建出性能优化、用户体验良好的Android应用。 1. Andr...

weixin_42601547的博客 1369

Android 网络编程基础

Android 网络编程是指在 Android 应用程序中实现网络通信功能。通过网络编程,可以使我们的应用程序与互联网进行交互,从而实现各种有趣、实用的功能。例如,获取最新新闻、下载文件、上传数据等。

特立独行的博客 1501

手把手排查IOMMU映射故障:从内核日志到硬件寄存器调试全指南

本文详细解析了IOMMU映射故障的排查方法,从内核日志分析到硬件寄存器调试,提供了一套完整的诊断流程。涵盖AMD和Intel平台的特定调试技巧,包括ATS协商失败、DMA传输错误等常见问题的解决方案,并介绍了高级调试工具链的搭建与性能优化策略。

weixin_42666036的博客 354

Android网络编程之Http协议

一、Http协议简介        在上一篇文章Android网络编程简介中我们说过,大部分的Android应用网络通信都是基于Http协议(超文本传输协议)的,Http协议属于应用层的协议,而应用层协议的作用是用来规定传输数据的格式,以便通信双方能够按照规则来解读数据。Http是基于TCP/IP通信协议来传递数据的,其通信依赖于传输层的TCP协议。Http协议由请求和响应组成,属于标准的客户端...

xiao_nian的博客 6896

开源代码分享(29)-基于拉丁超立方抽样的风光场景生成和削减

作为分层抽样方法的一 种,拉丁超立方抽样具有良好的抽样精度和效率[14]。本文使用多场景方法来描述可再生能源(风电、光伏)的不确定性。以风电功率为例,首先假定风电功率服从正态分布 N(μ, δ 2 ),μ 为预测值的期望值,δ 为其波动的百分比。接着,采用拉丁超立方抽样[21]生成大量服从概率分布约束的风电出力场景,并采用考虑 Kantorovich 距离[22]的场景削减技术处理该场景,进行场景削减。最后,导出具有相应概率的削减之后的场景。

配电网和matlab的博客 923

Token验证绕过 靶场实战

实验介绍 1.漏洞简介 在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。 具有以下几点特性: 1)无状态、可扩展 2)支持移动设备 3)跨程序调用 4)安全 2.原理基于Token的验证原理 基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。 NoSession意味着你的程序可以根据需要去增减机器,而不用去担心用户是...

weixin_54771278的博客 2251

Android网络编程中的Http协议总结

Android网络编程中的Http协议总结

扬帆起航 1445

UE4项目迁移指南:如何无缝导入外部.uasset文件并保持材质关联

本文详细解析了将外部.uasset文件无缝导入UE4项目的专业方法。针对手动复制文件时常见的材质关联丢失问题,提供了使用引用查看器进行诊断和修复的实用技巧,并推荐使用引擎内置的“迁移”功能确保资源依赖关系的完整性,帮助开发者高效整合项目资源。

t8u9v0的博客 1046

Android-网络编程-创建HTTP请求

一、所谓的网络编程就是在手机端使用TTP协议和服务器进行网络交互,并对服务器返回的数据进行解析。 二、调用百度网址 <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"...

求职之路 483

Oracle PLM Agile936 单点登录配置方式

Oracle PLM Agile936 单点登录配置方式

Jay的个人博客 824

Python爬虫实战:深度解析B站弹幕异步采集技术与数据可视化

title=f"弹幕词云 Top 100 (BV: {bvid})", title_textstyle_opts=opts.TextStyleOpts(font_size=23).add(series_name="弹幕词云", data_pair=list(top_100_words.items()), word_size_range=[20, 100]).add_xaxis([f"{i}-{i+1}分" for i in range(len(time_distribution))])

2201_76125261的博客 640

Android 之 网络编程与 Http 协议

答:hypertext transfer protocol(超文本传输协议),TCP/IP协议的一个应用层协议,用于 定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器 中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。

leyang0910的博客 578

flash均衡磨损--实时保存设备数据

【代码】flash均衡磨损--实时保存设备数据。

Car12 480

Android网络编程指南:从HTTP到WebSocket

网络编程是构建功能丰富的Android应用的必备技能。掌握现代化的网络库如OkHttp和Retrofit,能让你事半功倍,写出更健壮、更易于维护的代码。

m0_65382359的博客 1125

从自然语言到PCB设计:DeepSeek与Altium协同自动化实战指南

摘要:在电子设计领域,将自然语言需求转化为PCB设计图是实现自动化设计的重要目标。受限于当前NLP和EDA技术,通过DeepSeek直接生成完整PCB设计图尚无法实现,但在设计辅助环节已展现实用价值。本文深入分析技术可行性,提出"自然语言→设计约束→脚本生成→人工验证"的人机协同工作流。通过28个完整代码示例、12张技术图表及5个工程案例,详细展示DeepSeek解析需求、生成设计约束,并结合Altium Designer API实现元件放置、规则设置、DRC校验的全流程。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1760

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android基于HTTP网络编程总结浅析

首先,我们都知道现在Android网络编程只需要利用Afinalk

yianemail的专栏 839

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android网络编程:HTTP与HTTPS通信

HTTP(超文本传输协议)是一种用于从服务器传输超文本到本地浏览器的传输协议。HTTPS(安全超文本传输协议)是HTTP的安全版,通过SSL/TLS协议加密数据,提高数据传输的安全性。本文详细介绍了Android网络编程中的HTTP与HTTPS通信。通过对比HTTP与HTTPS的特点,分析了Android原生支持和第三方库的使用方法,讨论了安全性考虑和性能优化。为了确保数据安全和提高应用性能,开发者应在Android应用中优先使用HTTPS,并注意验证证书和使用连接池等技术。

2501_92487701的博客 378

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

基于Http协议的Android网络编程

本文就通过案例,着重分析基于Http协议的Android网络的原理实现,而不使用框架实现,当然更多的还是基础知识。

vanpersie_9987的博客 4623

android网络编程:Socket和Http

android的网络编程分为2种:基于socket的,和基于http协议的。 一、基于socket的用法   服务器端:   先启动一个服务器端的socket     ServerSocket svr = new ServerSocket(8989);   开始侦听请求         Socket s = svr.accept();   取得输入和输出        D

rabbit_in_android的博客 1202

android 网络编程https,android网络编程关于Socket和http协议

android的网络编程分为2种:基于socket的,和基于http协议的。基于socket的用法服务器端:先启动一个服务器端的socket ServerSocket svr = new ServerSocket(8989);开始侦听请求         Socket s = svr.accept();取得输入和输出        DataInputStream dis = new Dat...

weixin_35657239的博客 220

Android 网络编程 > HTTP协议原理 > OkHttp > Retrofit

网络分层网络分层(此处5层)从上到下分别是应用层、传输层、网络层、数据链路层和物理层。越靠下的层 越接近硬件。接下来我们从下而上来分别了解这些分层。物理层该层负责比特流在节点间的传输,即负责物理传输。该层的协议既与链路有关,也与传输介质有关。其通俗来讲就是把计算机连接起来的物理手段。数据链路层该层控制网络层与物理层之间的通信,其主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。

xfb的博客 1275

安卓网络编程——Android-async-http(网络通信框架)

之前学习了一款安卓的网络通信框架Volley https://blog.youkuaiyun.com/nishigesb123/article/details/89356776 Volley是谷歌官方推出的,而本文介绍的Android-async-http也是一个网络通信框架(准确点,网络请求框架)不过是第三方的。 之前学习了Apache HTTP Client,说Apache HTTP Client已...

旧日灯塔 1774

Android网络编程之socket和http协议的区别

相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助。   1、TCP连接  手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。   建立起一个TCP连接需要经过“三次握

飞上北极星 1949

Android网络编程(一)HTTP协议原理

这篇文章是这个系列的开篇,作为移动开发者,开发的应用不免会对网络进行访问,虽然现在已经有很多的开源库帮助我们可以轻而易举的访问网络,但是我们仍要去了解网络访问的原理,这也是一个优秀开发人员所必备的知识点。这篇文章我们就先来了解一下HTTP协议原理。

Android进阶三部曲 - 刘望舒 5万+

Android基于Socket和Http的网络编程

基于Socket和Http的网络编程 一、基于Socket套接字的网络编程 网络应用程序的开发有很多的架构和模式,常见的有C/S、B/S等,而Socket主要就是用于进行传统的C/S模式应用的开发。C/S模式中主要需要开发两个端,服务端和客户端,工作原理如下:   如上图所示: 1、首先服务器端启动,监听指定的连接端口等待客户端的连接数据请求; 2、客户端请求成功,连接到服务器的指

云水之路的专栏 1562
上一篇: jQuery.extend 函数详解
下一篇: Android适用代码片段
justdojava
博客等级 码龄17年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值