Android中使用HttpURLConnection和HttpClient实现GET和POST请求访问网络

HttpURLConnection中的GET

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Base64;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private EditText content;   //声明一个输入文本内容的编辑框对象
    private Button button;  //声明一个发表按钮对象
    private Handler handler; // 声明一个Handler对象
    private String result = ""; //声明一个代表显示内容的字符串
    private TextView resultTV;  //声明一个显示结果的文本框对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        content = (EditText) findViewById(R.id.content);    //获取输入文本内容的EditText组件
        resultTV = (TextView) findViewById(R.id.result);    //获取显示结果的TextView组件
        button = (Button) findViewById(R.id.button);    //获取“发表”按钮组件
        //为按钮添加单击事件监听器
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if ("".equals(content.getText().toString())) {
                    Toast.makeText(MainActivity.this, "请输入要发表的内容!",
                            Toast.LENGTH_SHORT).show(); //显示消息提示
                    return;
                }

                // 创建一个新线程,用于发送并读取微博信息
                new Thread(new Runnable() {
                    public void run() {
                        send(); //发送文本内容到Web服务器
                        Message m = handler.obtainMessage(); // 获取一个Message
                        handler.sendMessage(m); // 发送消息
                    }
                }).start(); // 开启线程
            }
        });
        //创建一个Handler对象
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (result != null) {
                    resultTV.setText(result); // 显示获得的结果
                    content.setText("");        //清空文本框
                }
                super.handleMessage(msg);
            }
        };
    }

    public void send() {
        String target="";
        target = "http://192.168.1.66:8081/blog/index.jsp?content="
                    +base64(content.getText().toString().trim());   //要访问的URL地址
        URL url;
        try {
            url = new URL(target);
            HttpURLConnection urlConn = (HttpURLConnection) url
                    .openConnection();  //创建一个HTTP连接
            InputStreamReader in = new InputStreamReader(
                    urlConn.getInputStream()); // 获得读取的内容
            BufferedReader buffer = new BufferedReader(in); // 获取输入流对象
            String inputLine = null;
            //通过循环逐行读取输入流中的内容
            while ((inputLine = buffer.readLine()) != null) {
                result += inputLine + "\n";
            }
            in.close(); //关闭字符输入流对象
            urlConn.disconnect();   //断开连接
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //对字符串进行Base64编码
    public String base64(String content){
        try {
            content=Base64.encodeToString(content.getBytes("utf-8"), Base64.DEFAULT);   //对字符串进行Base64编码
            content=URLEncoder.encode(content); //对字符串进行URL编码
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();    //输出异常信息
        }
        return content;
    }
}

HttpURLConnection中的POST

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private EditText nickname; // 声明一个输入昵称的编辑框对象
    private EditText content; // 声明一个输入文本内容的编辑框对象
    private Button button; // 声明一个发表按钮对象
    private Handler handler; // 声明一个Handler对象
    private String result = ""; // 声明一个代表显示内容的字符串
    private TextView resultTV; // 声明一个显示结果的文本框对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        content = (EditText) findViewById(R.id.content); // 获取输入文本内容的EditText组件
        resultTV = (TextView) findViewById(R.id.result); // 获取显示结果的TextView组件
        nickname = (EditText) findViewById(R.id.nickname); // 获取输入昵称的EditText组件
        button = (Button) findViewById(R.id.button); // 获取“发表”按钮组件
        // 为按钮添加单击事件监听器
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if ("".equals(nickname.getText().toString())
                        || "".equals(content.getText().toString())) {
                    Toast.makeText(MainActivity.this, "请将内容输入完整!",
                            Toast.LENGTH_SHORT).show();
                    return;
                }

                // 创建一个新线程,用于从网络上获取文件
                new Thread(new Runnable() {
                    public void run() {
                        send();
                        Message m = handler.obtainMessage(); // 获取一个Message
                        handler.sendMessage(m); // 发送消息
                    }
                }).start(); // 开启线程

            }
        });
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (result != null) {
                    resultTV.setText(result); // 显示获得的结果
                    content.setText(""); // 清空内容编辑框
                    nickname.setText(""); // 清空昵称编辑框
                }
                super.handleMessage(msg);
            }
        };
    }

    public void send() {
        String target = "http://192.168.1.66:8081/blog/dealPost.jsp";   //要提交的目标地址
        URL url;
        try {
            url = new URL(target);
            HttpURLConnection urlConn = (HttpURLConnection) url
                    .openConnection(); // 创建一个HTTP连接
            urlConn.setRequestMethod("POST"); // 指定使用POST请求方式
            urlConn.setDoInput(true); // 向连接中写入数据
            urlConn.setDoOutput(true); // 从连接中读取数据
            urlConn.setUseCaches(false); // 禁止缓存
            urlConn.setInstanceFollowRedirects(true);   //自动执行HTTP重定向
            urlConn.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded"); // 设置内容类型
            DataOutputStream out = new DataOutputStream(
                    urlConn.getOutputStream()); // 获取输出流
            String param = "nickname="
                    + URLEncoder.encode(nickname.getText().toString(), "utf-8")
                    + "&content="
                    + URLEncoder.encode(content.getText().toString(), "utf-8"); //连接要提交的数据
            out.writeBytes(param);//将要传递的数据写入数据输出流
            out.flush();    //输出缓存
            out.close();    //关闭数据输出流
            // 判断是否响应成功
            if (urlConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStreamReader in = new InputStreamReader(
                        urlConn.getInputStream()); // 获得读取的内容
                BufferedReader buffer = new BufferedReader(in); // 获取输入流对象
                String inputLine = null;
                while ((inputLine = buffer.readLine()) != null) {
                    result += inputLine + "\n";
                }
                in.close(); //关闭字符输入流
            }
            urlConn.disconnect();   //断开连接
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

HttpClient的GET

和HttpURLConnection中的Get上述代码中唯一不同的是send方法;

public void send() {
        String target = "http://192.168.1.66:8081/blog/deal_httpclient.jsp?param=get";  //要提交的目标地址
        HttpClient httpclient = new DefaultHttpClient();//创建HttpClient对象
        HttpGet httpRequest = new HttpGet(target);  //创建HttpGet连接对象
        HttpResponse httpResponse;
        try {
            httpResponse = httpclient.execute(httpRequest); //执行HttpClient请求
            if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                result = EntityUtils.toString(httpResponse.getEntity());    //获取返回的字符串
            }else{
                result="请求失败!";
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

HttpClient的POST

同样的和HttpURLConnection中的Post不同的是send方法:

public void send() {
        String target = "http://192.168.1.66:8081/blog/deal_httpclient.jsp";    //要提交的目标地址
        HttpClient httpclient = new DefaultHttpClient();    //创建HttpClient对象
        HttpPost httpRequest = new HttpPost(target);    //创建HttpPost对象
        //将要传递的参数保存到List集合中
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("param", "post"));    //标记参数
        params.add(new BasicNameValuePair("nickname", nickname.getText().toString()));  //昵称
        params.add(new BasicNameValuePair("content", content.getText().toString()));    //内容
        try {
            httpRequest.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //设置编码方式
            HttpResponse httpResponse = httpclient.execute(httpRequest);    //执行HttpClient请求
            if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){  //如果请求成功
                result += EntityUtils.toString(httpResponse.getEntity());   //获取返回的字符串

            }else{
                result = "请求失败!";
            }
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();   //输出异常信息
        } catch (ClientProtocolException e) {
            e.printStackTrace();    //输出异常信息
        } catch (IOException e) {
            e.printStackTrace();    //输出异常信息
        }
    }
时间: 2024-08-11 03:36:01

Android中使用HttpURLConnection和HttpClient实现GET和POST请求访问网络的相关文章

android中的HttpURLConnection和HttpClient实现app与pc数据交互

自学android的这几天很辛苦,但是很满足,因为每当学到一点点知识点都会觉得很开心,觉得今天是特别有意义的,可能这个就是一种莫名的热爱吧. 下面来说说今天学习的HttpURLConnection和HttpClient的区别吧,其实这2种都能进行客户端和服务器的数据交互,只是HttpClient封装的更完全. 先看下案例吧 第一种HttpURLConnection访问服务器: 客服端代码: package com.example.demo01; import java.io.IOExceptio

android中的HttpUrlConnection的使用之一

在我们之前学习Java的网络编程当中,我们已经见过HttpUrlConnection类的使用.HttpUrlConnect在Java是一个支持http特定的功能一个类,在许多的网络编程经常使用到它.今天我在这里记录的是android中使用HttpUrlConnection,之前我还学过使用异步加载来加载一个网站,它使用的原理同样是多线程,但是它使用的是用json来解析一个网站,而不是直接使用域名也就是网址来解析一个网站,而将要介绍的HttpUrlConnection是使用域名来解析一个网站的,当

Android中使用HTTP和HttpClient进行通信

/** * 使用HTTP的Get方式进行数据请求 */ protected void httpGet() { /** * 进行异步请求 */ new AsyncTask<String, Void, Void>() { @Override protected Void doInBackground(String... params) { System.err.println("httpGet start"); // 在此方法中只能进行数据处理,不能与进行UI交互 try {

Android中,HttpURLConnection与Apache的DefaultHttpClient哪个更被推荐使用?

在Android中,请求网络资源的方式包含了:HttpURLConnection和Apache的DefaultHttpClient.那么,这两个方式哪个更被推荐使用呢?Android官方文档为我们推荐HttpURLConnection,而理由是什么呢? 在Android 4.0,为HttpURLConnection增加了一个response cache(响应缓存),这是一个很好的减少http请求次数的机制,Android官方推荐使用HttpURLConnection而不是Apache的Defau

Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用 所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是 很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数 据交互,本人刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个 坑,总结下最常用的就通过HttpURLConnection来POST提交JSO

android中的HttpUrlConnection的使用之三

这一次, 我写的是关于web服务器在eclipse for JAVAEE 上面搭建和使用HttpUrlConnection来进行简单的数据传输. 1.首先我们下载javaEE,在eclipse的官网就能下载得到.JAVAEE的好处在于,它可以进行简单的服务器的搭建,因为软件里面就有相关的插件. 关于插件的使用,在此我简单的说明一下:当我们把JAVA EE安装完成过后,打开在Windows选项中选择preferences,在选择Server下面的RunTime Environments.这里最主要

[Android基础]Android中使用HttpURLConnection

HttpURLConnection继承了URLConnection,因此也能够向指定站点发送GET请求.POST请求.它在URLConnetion的基础上提供了例如以下便捷的方法. int getResponseCode():获取server的响应代码. String getResponseMessage():获取server的訪问信息. String getRequestMethod():获取发送请求的方法. void setRequestMethod(String method):设置发送请

android 中设置HttpURLConnection 超时并判断是否超时

设置超时: URL url1 = new URL(url); HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(3000); //3s conn.setReadTimeout(3000); //3s conn.setDoOutput(true); 本来以为设置了超时程序就会自动返回,不会有异常了

android中的HttpUrlConnection的使用之二

httpUrlConnection主要用于网络传输当中,前面已经提及到了使用HttpUrlConnection来加载一个网站,这里我记录一下:用它在网络上下载一张图片并且加载到imageview当中.我们需要注意的是:当前很多网站上的图片传输的模式主要分两种:1.一是加密传输,使用HttpsUrlConnection进行链接:2.而是非加密传输,使用HttpUrlConnection来传输.代码如下(非加密传输): xml代码 1 <LinearLayout xmlns:android="