一起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二)

一起Talk Android吧(第三百四十五回:解析JSON对象)

一起Talk Android吧(第三百二十五回:Android中网络通信之TCP通信模型二)