这篇文章主要实现了在Android中使用JDK的HttpURLConnection和Apache的HttpClient访问网络资源,服务端采用python+flask编写,使用Servlet太麻烦了。关于Http协议的相关知识,可以在网上查看相关资料。代码比较简单,就不详细解释了。
1. 使用JDK中HttpURLConnection访问网络资源
(1)get请求
public String executeHttpGet() {
String result = null;
URL url = null;
HttpURLConnection connection = null;
InputStreamReader in = null;
try {
url = new URL("http://10.0.2.2:8888/data/get/?token=alexzhou");
connection = (HttpURLConnection) url.openConnection();
in = new InputStreamReader(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(in);
StringBuffer strBuffer = new StringBuffer();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
strBuffer.append(line);
}
result = strBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
注意:因为是通过android模拟器访问本地pc服务端,所以不能使用localhost和127.0.0.1,使用127.0.0.1会访问模拟器自身。Android系统为实现通信将PC的IP设置为10.0.2.2
(2)post请求
public String executeHttpPost() {
String result = null;
URL url = null;
HttpURLConnection connection = null;
InputStreamReader in = null;
try {
url = new URL("http://10.0.2.2:8888/data/post/");
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Charset", "utf-8");
DataOutputStream dop = new DataOutputStream(
connection.getOutputStream());
dop.writeBytes("token=alexzhou");
dop.flush();
dop.close();
in = new InputStreamReader(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(in);
StringBuffer strBuffer = new StringBuffer();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
strBuffer.append(line);
}
result = strBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
如果参数中有中文的话,可以使用下面的方式进行编码解码:URLEncoder.encode("测试","utf-8")
URLDecoder.decode("测试","utf-8");
2.使用Apache的HttpClient访问网络资源
(1)get请求public String executeGet() {
String result = null;
BufferedReader reader = null;
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(
"http://10.0.2.2:8888/data/get/?token=alexzhou"));
HttpResponse response = client.execute(request);
reader = new BufferedReader(new InputStreamReader(response
.getEntity().getContent()));
StringBuffer strBuffer = new StringBuffer("");
String line = null;
while ((line = reader.readLine()) != null) {
strBuffer.append(line);
}
result = strBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
reader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
(2)post请求public String executePost() {
String result = null;
BufferedReader reader = null;
try {
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost();
request.setURI(new URI("http://10.0.2.2:8888/data/post/"));
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("token", "alexzhou"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(
postParameters);
request.setEntity(formEntity);
HttpResponse response = client.execute(request);
reader = new BufferedReader(new InputStreamReader(response
.getEntity().getContent()));
StringBuffer strBuffer = new StringBuffer("");
String line = null;
while ((line = reader.readLine()) != null) {
strBuffer.append(line);
}
result = strBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
reader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
3.服务端代码实现上面是采用两种方式的get和post请求的代码,下面来实现服务端的代码编写,使用python+flask真的非常的简单,就一个文件,前提是你得搭建好python+flask的环境,代码如下:#coding=utf-8
import json
from flask import Flask,request,render_template
app = Flask(__name__)
def send_ok_json(data=None):
if not data:
data = {}
ok_json = {'ok':True,'reason':'','data':data}
return json.dumps(ok_json)
@app.route('/data/get/',methods=['GET'])
def data_get():
token = request.args.get('token')
ret = '%s**%s' %(token,'get')
return send_ok_json(ret)
@app.route('/data/post/',methods=['POST'])
def data_post():
token = request.form.get('token')
ret = '%s**%s' %(token,'post')
return send_ok_json(ret)
if __name__ == "__main__":
app.run(host="localhost",port=8888,debug=True)
运行服务器,如图:
4. 编写单元测试代码
右击项目:new–》Source Folder取名tests,包名是:com.alexzhou.androidhttp.test(随便取,没有要求),结构如图:
在该包下创建测试类HttpTest,继承自AndroidTestCase。编写这四种方式的测试方法,代码如下:
public class HttpTest extends AndroidTestCase {
@Override
protected void setUp() throws Exception {
Log.e("HttpTest", "setUp");
}
@Override
protected void tearDown() throws Exception {
Log.e("HttpTest", "tearDown");
}
public void testExecuteGet() {
Log.e("HttpTest", "testExecuteGet");
HttpClientTest client = HttpClientTest.getInstance();
String result = client.executeGet();
Log.e("HttpTest", result);
}
public void testExecutePost() {
Log.e("HttpTest", "testExecutePost");
HttpClientTest client = HttpClientTest.getInstance();
String result = client.executePost();
Log.e("HttpTest", result);
}
public void testExecuteHttpGet() {
Log.e("HttpTest", "testExecuteHttpGet");
HttpClientTest client = HttpClientTest.getInstance();
String result = client.executeHttpGet();
Log.e("HttpTest", result);
}
public void testExecuteHttpPost() {
Log.e("HttpTest", "testExecuteHttpPost");
HttpClientTest client = HttpClientTest.getInstance();
String result = client.executeHttpPost();
Log.e("HttpTest", result);
}
}
附上HttpClientTest.java的其他代码:public class HttpClientTest {
private static final Object mSyncObject = new Object();
private static HttpClientTest mInstance;
private HttpClientTest() {
}
public static HttpClientTest getInstance() {
synchronized (mSyncObject) {
if (mInstance != null) {
return mInstance;
}
mInstance = new HttpClientTest();
}
return mInstance;
}
/**...上面的四个方法...*/
}
现在还需要修改Android项目的配置文件AndroidManifest.xml,添加网络访问权限和单元测试的配置,AndroidManifest.xml配置文件的全部代码如下:<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alexzhou.androidhttp"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" />
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.alexzhou.androidhttp" />
</manifest>
注意:
android:name=”android.test.InstrumentationTestRunner”这部分不用更改
android:targetPackage=”com.alexzhou.androidhttp”,填写应用程序的包名
5.测试结果
展开测试类HttpTest,依次选中这四个测试方法,右击:Run As–》Android Junit Test。
(1)运行testExecuteHttpGet,结果如图:
(2)运行testExecuteHttpPost,结果如图:
(3)运行testExecuteGet,结果如图:
(4)运行testExecutePost,结果如图:
转载请注明来自:Alex
Zhou,本文链接:http://codingnow.cn/android/723.html
分享到:
相关推荐
Android WebService网络请求的实现 Android开发之线程池使用总结 Android学习路线总结,绝对干货 逆流的鱼的博客 汇总优秀的android开发资源 Android学习资源网站索引大全 Android Studiod的配置大全 深入理解...
如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片文件下载上传,Http请求工具,常用工具类(字符串,日期,文件处理,图片处理工具类等),能够使您的应用在团队开发中减少冗余代码,很大的提高了...
推荐项目kotlin_tips,用Kotlin去提高生产力:汇总Kotlin相对于Java的优势,以及怎么用Kotlin去简洁、务实、高效、安全开发的Tips 推荐项目easy_mock_api,给客户端同学的模拟json接口的小工具 推荐项目CompatWebView...
AOSF:AOSF:全称为Android开放源代码框架,即Android优秀开源框架汇总。包含:网络请求okhttp,图片下载glide,数据库greenDAO,链式框架RxJava,组件路由ARouter,消息传递通信EventBus,热更新Tinker,插件化框架...
有:Android发送HTTP POST请求示范.docx,android电话服务.docx,android图片处理.docx,Android权限列表permission说明.docx,android振动器.docx,ksoap2-android.docx,不允许连接Socket.docx等些文档。
Android 优秀开源项目汇总 事件总线(订阅者模式) 通过发布/订阅事件解耦事件发送和接受,从而简化应用程序之间的通信 1.EventBus 作者 greenrobot 项目地址: 原理剖析文档: 特点: (1) 支持在不同类型的线程中处理...
程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: 1. android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在 checkin数据库中,改值可以修改上传...
然而,真正能做到如上过程的人非常少,于是我们觉得将这些优秀的开源组件分门别类汇总起来,再进行使用讲解和代码剖析,可以真正的让更多人受益,于是就有了这里你看到的Android 开源组件深度剖析。 欢迎每一位分享...
开源项目分类汇总,star数量1.7W+ 项目说明: Android 开源项目第一篇——个性化控件(View)篇 包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、...
权限请求框架 网络请求框架 作者 项目 JiangHaiYang01 Retrofit 与 协程结合 断点下载 上传,网络缓存 JiangHaiYang01 Retrofit 与 RxJava 完美结合,支持断点下载,上传,支持缓存,自定义绑定生命周期 ...
Android 学习文档总结 ................... 1 DevDiv 推荐资源 ........................ 2 Windows 8 ........................................................... 2 iOS .........................................
每当 App 启动时,七牛 Agent 开始工作,应用有网络请求时,通过之前部署的 SDK 探针以一定的采集频率来采集数据,并对采集的数据进行汇总后,上传到服务器(已报表的形式展现) 应用退出到后台或用户关闭App时,七...
java安卓仿微信聊天软件源码 # 复习资料 类库 应用架构 Android 这是一份详细的RxJava学习攻略 ...Framework,即Android优秀开源框架汇总。包含:网络请求okhttp,图片下载glide,数据库greenDAO,链
钱德勒计划-Android这不是出于商业目的我为什么建造它? 我为我的毕业论文构建此应用程序。该应用程序的标题是什么... 对于购买者:该应用程序将为用户提供一个门户网站,该门户网站汇总了他们不一定了解或无法访问
flutter_dart_live_template 我使用的个人 / 集合。要将实时模板配置导入到Intellij / WebStorm / Android Studio中,请执行以下... 现在,该版本是中的代码,我将尝试通过请求使其动态以获取最新版本。 内置的valdevde
由于被利用的站点未公开提供检索广告的API,因此我不得不使用研究这些站点的Android应用程序发出的请求和收到的响应。 一旦安装并配置了Packet Capture,您要做的就是启动应用程序,使用所有可能的条件进行首次搜索...
AOSF.zip,OSF:全称为Android Open Source Framework,即Android优秀开源框架汇总。包含:网络请求,图片下载,数据库,链式框架,组件路由,消息传递通信,热更新,文件下载,图片选择,图片滤镜/毛玻璃等特效处理...
1、 我介绍 2、 我试了哪些公司 3、 我做了哪些准备 1、递归如何保证不进太多的压栈操作 3、A,B,C,D四个请求链条,如何记录这四个服务的个链式调的志
[export]使用内部请求处理器而不是localhost进行请求导出 [logger]删除SDK不匹配警告,因为它们应完全兼容 [populator]将populator标记添加到所有生成的用户 [推送]批量发送邮件删除 [推送]处理其他凭证的自动补全 ...
所以,小近使出洪荒之力汇总了近乎v5.0八大全新特色,以颜值+实力圈粉儿,百分百的撩技只能给满分! 二、菜单功能 1、 模块众多,按需组合 快速实现组装与定制是v5.0第一大特色。借助文章(可变身为博客)、组图、...