一起Talk Android吧(第三百三十五回: Android中的HTTP请求二)
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第三百三十五回: Android中的HTTP请求二)相关的知识,希望对你有一定的参考价值。
各位看官们大家好,上一回中咱们说的是android中HTTP请求的例子,这一回中咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!
看官们,我们在上一章回中介绍了如何使用Java中的HTTP接口发起HTTP的GET请求,本章回中将介绍如何使用Java中的HTTP接口发起HTTP的POST请求
.
POST请求步骤
下面是具体的操作步骤:
- 1.使用URL创建一个URL对象,这里的URL通俗点讲就是我们上网时使用的网址;
- 2.使用URL对象的openConnection()方法获取HttpURLConnection对象;
- 3.使用HttpURLConnection对象的setRequestMethod()方法设定请求类型为POST;
- 4.使用HttpURLConnection对象设定超时等参数;
- 5.使用HttpURLConnection对象的getOutputStream()方法获取输出流;
- 6.把需要请求的内容放到输出流中,注意请求内容的格式要正确(符合HTTP POST请求规范);
- 7.使用HttpURLConnection对象的getInputStream()方法获取输入流;
- 8.在输入流中读取网站返回的数据,这些数据就是我们向URL所指网站发出GET请求后,网站响应的数据;
- 9.关闭输出流和输入流并且使用HttpURLConnection对象的disconnect()方法断开网络连接;
除了需要掌握这些步骤外,还有以下内容需要引起注意:
- 1.与HttpURLConnection相关的操作需要处理异常;
- 2.获取输出流和输入流需要在子线程中进行,Android不允许在主线程中做此操作;
- 3.网络操作容易发生错误,需要使用HttpURLConnection对象的getResponseCode()获取响应码,只有响应码为200时才表示获取数据成功;
- 4.获取数据时打开的各种流都需要关闭,最后还需要断开网络连接,否则会引起内存泄漏;
POST请求示例代码
下面是程序的主要代码,请大家参考:
private static final String HTTP_URL = "https://www.baidu.com/";
private void initHttp()
//注意:new URL和openConnection都需要处理异常,为了方便把它们统一放到一个try/catch中
try
mURL = new URL(HTTP_URL);
mHttpURLConnection = (HttpURLConnection)mURL.openConnection();
if(mHttpURLConnection != null)
mHttpURLConnection.setRequestMethod("POST");
mHttpURLConnection.setConnectTimeout(5*1000);
mHttpURLConnection.setReadTimeout(3*1000);
catch (Exception e)
Log.d(TAG, "initHttp: Exception:"+e.toString());
private void httpPostRequest()
if(mHttpURLConnection == null)
Log.d(TAG, "httpPostRequest: connection is null");
return;
try
mOutputStream = mHttpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(mOutputStream));
bufferedWriter.write("?csdn");
bufferedWriter.close();
bufferedWriter = null;
catch (IOException e)
Log.d(TAG, "httpPostRequest: outPutStream Exception:"+e.toString());
try
if(200 == mHttpURLConnection.getResponseCode())
mInputStream = mHttpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mInputStream));
StringBuilder stringBuilder = new StringBuilder();
String tempStr = bufferedReader.readLine();
while (tempStr != null)
stringBuilder.append(tempStr);
tempStr = bufferedReader.readLine();
bufferedReader.close();
bufferedReader = null;
mStrData = stringBuilder.toString();
Log.d(TAG, "httpPostRequest: read Data = "+mStrData);
else
Log.d(TAG, "httpPostRequest: request result: "+mHttpURLConnection.getResponseCode());
catch (Exception e)
Log.d(TAG, "httpPostRequest: post Data Exception: "+e.toString());
private void releaseConnection()
if(mInputStream != null)
try
mInputStream.close();
mInputStream = null;
catch (Exception e)
Log.d(TAG, "releaseConnection: close inputStream "+e.toString());
if(mOutputStream != null)
try
mOutputStream.close();
mOutputStream = null;
catch (Exception e)
Log.d(TAG, "releaseConnection: close outputStream "+e.toString());
if(mHttpURLConnection != null)
mHttpURLConnection.disconnect();
mHttpURLConnection = null;
上面的程序中我们向百度网站发起HTTP的POST请求,然后从百度网站的返回结果中获取数据,我们没有对数据进行处理,而是将所有数据全部打印出来。注意一下我们在POST请求中只使用了一个请求内容,如果有多个请求内容需要使用"&"来分隔开,POST请求中还可以添加其它的内容,我们在这里就不详细介绍了,大家可以参考HTTP协议中POST请求的规范。
上面的程序只有主要功能的代码,其它代码省略了,此外,页面布局中只有一个Button,与布局相关的代码大家可以自已补充,我们在这里就不列出了。建议大家自己动手运行程序,通过程序的运行结果查看网站对HTTP请求的响应。
对比POST与GET两种请求
POST请求的响应数据比GET请求的响应数据多,而且需要分析请求内容的响应值,这个是被请求网站处理的,我们的程序中使用"CSDN"来当作请求内容,其实百度没有对此内容做响应。如果想处理响应内容,我们可以自己搭建一个网站来处理响应请求,然后通过程序来验证。这些内容比较多,我们就不在这里展开讨论了。
看官们,大家可能会发现POST请求和GET请求十分相似,其实它们还是有些差别的,我们对它们的相同点和不同点做如下总结:
- 1.网络初始化操作过程相同,在设置初始化请求参数时请求类型不同;
- 2.GET请求是在初始化后直接发起的,而POST请求需要按照规范写好请求内容后才能发起请求;
- 3.获取网站响应数据时都通过输入流来完成,但是对响应数据的处理不一样,我们在代码中没有做区分;
看官们,关于Android中HTTP请求的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
以上是关于一起Talk Android吧(第三百三十五回: Android中的HTTP请求二)的主要内容,如果未能解决你的问题,请参考以下文章
一起talk C栗子吧(第一百三十五回:C语言实例--exec系列函数一)
一起Talk Android吧(第三百三十六回: Android中的volley一)
一起Talk Android吧(第三百一十五回:Android中的ActionBar)
一起Talk Android吧(第三百三十九回: Android中的OkHttp二)