Http的get和post请求简单应用

网络请求中需要遵循http协议,而http有许多方法,大家一般最常用的就是post和get请求方法了!
其中,post和get都可以向服务器发送和请求数据,而我们一般都习惯用get请求数据,post发送数据!get方法是把数据拼接到请求行里面,我们可以直接看到里面的数据,相比较post不安全,但是简单,快捷(大小限制不超过2K)!post则是把要发送的数据转换成流的方式,大小不限制,上传给服务器,相比较get安全些!

基础定义和知识讲解不详细,大家可以参考大神的讲解,详细学习:

链接地址

其中本人AS版本2.3.如果你的AS版本低于2.2估计运行我的代码会报错,因为用到了最新的ConstraintLayout书写的布局,学习ConstraintLayout的链接我也放上去:

constraintlayout学习

本DEMO地址

效果图上两张:
这里写图片描述

这里写图片描述
下面我们直接上代码:
Xml布局代码就不放了都是用鼠标拉过来拉过去自动生成的代码

MainActivity代码:

package com.btzh.myhttptest;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import CommonUntils.HttpUntils;

public class MainActivity extends BaseActivity implements View.OnClickListener {
    private Button htmlbtn, picbtn,posthtmlbtn,postpichtn;
    private TextView textView;
    private ImageView imageView;
    int viewID = -1;
    HttpUntils Myuntils = new HttpUntils();
    String XML_Url = "http://toutiao.sogou.com/?fr=qqxwtt";
    String XMl_Url_test = "http://baike.sogou.com/v6234.htm?fromTitle=%E7%99%BE%E5%BA%A6";
    String pic_Url = "http://d.ifengimg.com/mw978_mh598/p2.ifengimg.com/a/2017_15/65bdb6e5ca68409_size79_w930_h620.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        initViews();
    }

    /**
     * 初始化视图控件
     */
    private void initViews(){
        htmlbtn = (Button) findViewById(R.id.button_gethtml);
        htmlbtn.setOnClickListener(this);
        picbtn = (Button) findViewById(R.id.button_getpic);
        picbtn.setOnClickListener(this);
        textView = (TextView)findViewById(R.id.textView);
        imageView = (ImageView)findViewById(R.id.imageView);
        posthtmlbtn = (Button)findViewById(R.id.button_posthtml);
        posthtmlbtn.setOnClickListener(this);
        postpichtn = (Button)findViewById(R.id.button_postpic);
        postpichtn.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        viewID = v.getId();
        if (viewID == R.id.button_gethtml)
        {   //get获取XMl信息
            new MyXMlTask().execute();

        }else if (viewID == R.id.button_getpic)
        {   //get获取图片信息
            showProgressDialog("正在加载图片!");
            new MyAsyncTask().execute();
        }else if (viewID == R.id.button_posthtml)
        {   //post获取xml信息
            new MyPostTask().execute();
        }else if (viewID == R.id.button_postpic)
        {   //post获取图片信息
            new MyPostpicTask().execute();
        }else {

        }
    }

    /**
     * get方法获取图片信息
     */
    private class MyAsyncTask extends AsyncTaskUntils<Object, Object, Object>{
        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            hideProgressDialog();
            if (textView.getVisibility()==View.VISIBLE){
                textView.setText("");
                textView.setVisibility(View.GONE);
            }
            imageView.setVisibility(View.VISIBLE);
            imageView.setImageBitmap((Bitmap) o);
        }
    }

    /**
     * get 方法异步获取url数据
     */
    private class MyXMlTask extends AsyncTask<String, Integer,String>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showProgressDialog(R.string.XMl_Toast);
        }

        @Override
        protected String doInBackground(String... params) {
            String string = Myuntils.URL_getString(XML_Url);
            return string;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            hideProgressDialog();
            if (imageView.getVisibility()==View.VISIBLE){
                imageView.setImageDrawable(null);
                imageView.setVisibility(View.GONE);
            }
            textView.setVisibility(View.VISIBLE);
            textView.setText(s);
        }
    }

    /**
     * Post 方法异步获取url数据
     */
    private class MyPostTask extends AsyncTask<String,Integer,String>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showProgressDialog("Post正在加载网页信息!");
        }

        @Override
        protected String doInBackground(String... params) {
            String postStr = Myuntils.URL_postString(XMl_Url_test);
            return postStr;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            hideProgressDialog();
            if (imageView.getVisibility()==View.VISIBLE){
                imageView.setImageDrawable(null);
                imageView.setVisibility(View.GONE);
            }
            textView.setVisibility(View.VISIBLE);
            textView.setText(s);
        }
    }
    /**
     * Post 方法异步获取url图片数据
     */
    private class MyPostpicTask extends AsyncTask<String,Object,Object>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showProgressDialog("Post正在加载图片信息...");
        }

        @Override
        protected Object doInBackground(String... params) {
            Bitmap postbitmap = Myuntils.URL_postitmap(pic_Url);
            return postbitmap;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            hideProgressDialog();
            if (textView.getVisibility()==View.VISIBLE){
                textView.setText("");
                textView.setVisibility(View.GONE);
            }
            imageView.setVisibility(View.VISIBLE);
            imageView.setImageBitmap((Bitmap)o);
        }
    }
}

代码注释很详细,其中用的是asynctask异步来处理的消息,没有用handler,以后会用!
然后就是自己封装的http和流解析的两个类了,

package CommonUntils;

import android.graphics.Bitmap;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import CommonUntils.StreamTools;

/**
 * Created by Lenovo on 2017/4/7.
 */

public class HttpUntils {
    private int HTTP_TIMEOUT_CONNECTION = 6*10000;
    private int HTTP_TIMER_READ = 1*10000;

    /**
     * 返回bitmap
     * @param httpUrl
     * @return
     */
    public Bitmap URL_getbitmap(String httpUrl)
    {
        Bitmap bitmap = null;
        if ("" == httpUrl||null==httpUrl){
            return null;
        }
        InputStream inputStream = null;
        try {
            //创建url对象
            URL url = new URL(httpUrl);
            //打开connection连接
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            //设置请求方法
            connection.setRequestMethod("GET");
            //设置连接超时时间
            connection.setConnectTimeout(HTTP_TIMEOUT_CONNECTION);
            //设置读取时间
            connection.setReadTimeout(HTTP_TIMER_READ);
            //connection链接
            connection.connect();
            //判断是否连接成功,标识符号为200
            if (HttpURLConnection.HTTP_OK!=connection.getResponseCode())
            {
                return null;
            }
            //获取请求到的流
             inputStream = connection.getInputStream();
            //bitmap接收流对象(流转换为Bitmap格式对象)
             bitmap = StreamTools.getBitmap(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {  //一般最好写上,用来关闭前面开启的流对象,来减少内存占用
            try {
                    if (null!=inputStream){
                        inputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

        }
        return bitmap;
    }

    public String URL_getString(String httpUrl)
    {
        String string = "";
        if ("" == httpUrl || null==httpUrl){
            return "值为空!";
        }
        InputStream inputStream = null;
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(HTTP_TIMEOUT_CONNECTION);
            connection.setReadTimeout(HTTP_TIMER_READ);
            connection.connect();
            if (HttpURLConnection.HTTP_OK!=connection.getResponseCode())
            {
                return "连接失败!";
            }
            inputStream = connection.getInputStream();
            string = StreamTools.getString(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (null!=inputStream){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return string;
    }

    /**
     * post 请求数据返回 String
     * @param httpUrl
     * @return String
     */
    public String URL_postString(String httpUrl)
    {
        if ("".equals(httpUrl) || null==httpUrl){
            return null;
        }
        OutputStream outputStream = null;
        String postStr = "";
        InputStream inputStream = null;
        try {
            //创建Url对象
            URL url = new URL(httpUrl);
            //创建connection的url连接
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setConnectTimeout(HTTP_TIMEOUT_CONNECTION);
            connection.setReadTimeout(HTTP_TIMER_READ);
            connection.setRequestMethod("POST");
            //这两个方法post必须开启
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.connect();
            //这句话加上一直报错,说我已经connect成功服务器,是不是需要写在connection.connect();前面
//            connection.setUseCaches(false);
            //data为需要传入服务器的数据,这里我们传空
            String data = "";
            //打开输入流
            outputStream = connection.getOutputStream();
            //往输入流中写入我们需要传入服务器的数据(格式为byte格式)
            outputStream.write(data.getBytes());
            outputStream.flush();
            //判断是否响应成功(其实就是Tcp/IP三次握手是否成功)
            if (HttpURLConnection.HTTP_OK!=connection.getResponseCode()){
                return "连接失败";
            }
            //获取服务器返回数据流
            inputStream = connection.getInputStream();
            //转换为String格式
            postStr = StreamTools.getString(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {  //关闭各种流
                try {
                    if (outputStream!=null){
                        outputStream.close();
                    }
                    if (inputStream!=null){
                        inputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

        }
        return postStr;
    }

    /**
     * post 请求数据返回Bitmap
     * @param httpUrl
     * @return Bitmap
     */
    public Bitmap URL_postitmap(String httpUrl)
    {
        if ("".equals(httpUrl) || null==httpUrl){
            return null;
        }
        OutputStream outputStream = null;
        Bitmap postBitmap = null;
        InputStream inputStream = null;
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setConnectTimeout(HTTP_TIMEOUT_CONNECTION);
            connection.setReadTimeout(HTTP_TIMER_READ);
            connection.setRequestMethod("POST");
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.connect();
//            connection.setUseCaches(false);
            String data = "";
            outputStream = connection.getOutputStream();
            outputStream.write(data.getBytes());
            outputStream.flush();
            if (HttpURLConnection.HTTP_OK!=connection.getResponseCode()){
                return null;
            }
            inputStream = connection.getInputStream();
            postBitmap = StreamTools.getBitmap(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (outputStream!=null){
                    outputStream.close();
                }
                if (inputStream!=null){
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return postBitmap;
    }
}

Stream类

package CommonUntils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * Created by Lenovo on 2017/4/7.
 */

public class StreamTools {
    /**
     * inputStream 转换 Bitmap;
     * @param inputStream
     * @return bitmap
     */
    public static Bitmap getBitmap(InputStream inputStream){

        if (null == inputStream){
            return null;
        }
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
        return bitmap;
    }

    /**
     * inputStream转String
     * @param inputStream
     * @return String
     */
    public static String getString(InputStream inputStream){
        if (null==inputStream){
            return null;
        }
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader reader = new BufferedReader(inputStreamReader);
        StringBuffer stringBuffer = new StringBuffer("UTF-8");
        String line = null;
        try {
            while ((line = reader.readLine())!=null){
                stringBuffer.append(line+"\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return stringBuffer.toString();
    }

    /**
     * inputStream 转 byte[]
     * @param inputStream
     * @return byte[]
     */
    public static byte[] getBytes(InputStream inputStream) {
        String str = "";
        byte[] readByte = new byte[1024];
        int readCount = -1;
        try {
            while ((readCount = inputStream.read(readByte, 0, 1024)) != -1) {
                str += new String(readByte).trim();
            }
            return str.getBytes();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * inputStream 转 Drawable
     * @param inputStream
     * @return Drawable
     */
    public static Drawable getDrawable(InputStream inputStream){
        if (null==inputStream){
            return null;
        }
        Bitmap bitmap = getBitmap(inputStream);
        Drawable drawable = bitmap_Drawable(bitmap);
        return drawable;
    }
    // Bitmap转换成Drawable
    public static Drawable bitmap_Drawable(Bitmap bitmap) {
        if (null==bitmap){
            return null;
        }
        BitmapDrawable bd = new BitmapDrawable(bitmap);
        Drawable drawable = (Drawable) bd;
        return drawable;
    }

}

可以直接调用类中方法即可!
最后Mainactivity 继承的是自己写的BaseActivity,用来控制进度条的显示,有兴趣可以下载demo进行测试!
下一篇要研究Handler和Thread的了,come on! 有错误多谢大家指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值