一起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请求的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值