Android使用Http访问网络

Android6.0(API23)系统之后,Android上发送HTTP请求的方式只有一种HttpUrlConnection

基本用法:通过一个执行路径的URL,获取到HttpUrlConnection对象,然后就可以获取到服务器端的二进制数据,最后将二进制数据转为可以阅读的的数据。

public class HttpUrlConnectionActivity extends AppCompatActivity {

    private TextView tvShowNet;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvShowNet = (TextView) findViewById(R.id.tv_show);
    }

    public void http(View view) {
        //开启线程请求网络
        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    //1.创建URL对象(传入一个路径)
                    URL url = new URL("https://www.baidu.com/");
                    //2. 获取HttpURLConnection对象
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    //3.设置请求方法(默认是GET,用来向服务器请求数据,POST用来向服务器提交数据)
                    connection.setRequestMethod("GET");
                    //4.设置其他的参数,比如请求超时、读取超时毫秒数、服务器返回的状态码等等
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(5000);
                    //状态码为200的时候,说明和服务器成功连接
                    int code = connection.getResponseCode();
                    Log.i("--", "状态码:" + code);
                    //5. 获取从服务器返回的输入流
                    if (code == 200) {
                        InputStream in = connection.getInputStream();
                        //6.对二进制流进行读取
                        BufferedReader br = new BufferedReader(new InputStreamReader(in));
                        StringBuffer sb = new StringBuffer();
                        String line;
                        while ((line = br.readLine()) != null) {
                            sb.append(line);
                        }
                        //显示数据
                        showURLText(sb.toString());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {

                }
            }
        }).start();
    }

    private void showURLText(final String s) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvShowNet.setText(s);
            }
        });
    }
}

当然我们在开发中都是使用封装好的库进行访问网络,比如okhttp

GET请求:

//开启子线程访问网络
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            //1.创建OkHttpClient对象
            OkHttpClient client = new OkHttpClient();
            //2.创建Request对象
            Request request = new Request.Builder().url("https://www.baidu.com/").build();
            //3. 同步请求
           // Response response = client.newCall(request).execute();
            // 4.异步请求
              client.newCall(request).enqueue(new Callback() {
                  @Override
                  public void onFailure(Call call, IOException e) {

                  }

                  @Override
                  public void onResponse(Call call, Response response) throws IOException {
                      String s = response.body().string();
                      if (s != null) {
                          showText(s);
                      }
                  }
              });


        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }
}).start();
POST请求:其实比get多了一个创建表单并往表单增加数据的步骤

//开启子线程访问网络
new Thread(new Runnable() {
    @Override
    public void run() {
        try {

            //1.创建OkHttpClient对象
            OkHttpClient client = new OkHttpClient();
            //2.创建RequestBody对象
            RequestBody requestBody = new FormBody.Builder()
                    .add("username", "tom")
                    .add("password", "123")
                    .build();
            //3.创建Request对象
            Request request = new Request.Builder()
                    .post(requestBody)
                    .url("https://www.baidu.com/")
                    .build();
            //4. 同步请求
            // Response response = client.newCall(request).execute();
            //5.异步请求
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String s = response.body().string();
                    if (s != null) {
                        showText(s);
                    }
                }
            });


        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }
}).start();
我们可以看到okhttp已经封装的比较屌了,但是还是需要各种切换线程,所以推荐使用OkGo,简单到哭

public void okGo(View view) {
    OkGo.<String>get("https://www.baidu.com/").tag(this).execute(new StringCallback() {
        @Override
        public void onSuccess(Response<String> response) {
              tvOkGo.setText(response.body().toString());
        }

        @Override
        public void onError(Response<String> response) {

        }
    });
}
https://github.com/jeasonlzy/okhttp-OkGo



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值