Python工程师教你如何使用Android HttpClient发送HTTP请求

一、HttpClient简介

HttpClient是Apache组织发布的开源HTTP客户端库,它支持多线程连接、连接池、SSL、Cookie等特性。Python、Java、C#、C++等多个语言都有HttpClient的实现,本文介绍的是在Android平台上使用HttpClient发送HTTP请求。

二、HttpClient使用流程

HttpClient的使用流程大致如下:

// 创建HttpClient对象,设置连接池和Cookie存储
HttpClient httpClient = new DefaultHttpClient();
httpClient.setConnPoolTimeout(30 * 1000); // 设置连接超时时间
httpClient.setSoTimeout(30 * 1000); // 设置读取超时时间
httpClient.setCookieStore(new BasicCookieStore()); // 设置Cookie存储

// 创建Http请求对象
HttpPost httpPost = new HttpPost(url);

// 设置请求参数
List params = new ArrayList();
params.add(new BasicNameValuePair("username", "test"));
params.add(new BasicNameValuePair("password", "123456"));
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

// 执行Http请求,获取响应对象
HttpResponse response = httpClient.execute(httpPost);

// 解析响应结果
String result = EntityUtils.toString(response.getEntity(), "UTF-8");

上述代码通过创建HttpClient对象、创建Http请求对象、设置请求参数、执行Http请求、解析响应结果等步骤来发送HTTP请求。

三、发送GET请求

使用HttpClient发送GET请求也比较简单,只需要使用HttpGet对象替换HttpPost对象,并传入请求参数即可。

// 创建Http请求对象
HttpGet httpGet = new HttpGet(url + "?param=123");

// 执行Http请求,获取响应对象
HttpResponse response = httpClient.execute(httpGet);

// 解析响应结果
String result = EntityUtils.toString(response.getEntity(), "UTF-8");

四、发送文件

使用HttpClient发送文件需要使用MultipartEntityBuilder对象,它可以添加文件参数、普通参数,可以设置字符编码,也可以设置进度监听器。

// 创建Http请求对象
HttpPost httpPost = new HttpPost(url);

// 创建MultipartEntityBuilder对象,设置字符编码和进度监听器
MultipartEntityBuilder builder = MultipartEntityBuilder.create()
        .setCharset(Charset.forName("UTF-8"))
        .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
        .addPart("file", new FileBody(file, ContentType.DEFAULT_BINARY))
        .addTextBody("param1", "value1", ContentType.create("text/plain", Charset.forName("UTF-8")))
        .addTextBody("param2", "value2", ContentType.create("text/plain", Charset.forName("UTF-8")))
        .setBoundary("----WebKitFormBoundary7MA4YWxkTrZu0gW");

// 设置请求参数
httpPost.setEntity(builder.build());

// 执行Http请求,获取响应对象
HttpResponse response = httpClient.execute(httpPost);

// 解析响应结果
String result = EntityUtils.toString(response.getEntity(), "UTF-8");

五、发送JSON数据

使用HttpClient发送JSON数据需要使用StringEntity对象,它可以设置字符编码和Content-Type。

// 创建Http请求对象
HttpPost httpPost = new HttpPost(url);

// 设置请求头和请求参数
httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
httpPost.setEntity(new StringEntity(jsonStr, "UTF-8"));

// 执行Http请求,获取响应对象
HttpResponse response = httpClient.execute(httpPost);

// 解析响应结果
String result = EntityUtils.toString(response.getEntity(), "UTF-8");

六、完整示例代码

package com.example.httpclientdemo;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private TextView mResultTv;
    private Button mGetBtn;
    private Button mPostBtn;
    private Button mFileBtn;
    private Button mJsonBtn;
    private HttpClient mHttpClient;
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    mResultTv.setText("GET请求结果:\n" + msg.obj);
                    break;
                case 1:
                    mResultTv.setText("POST请求结果:\n" + msg.obj);
                    break;
                case 2:
                    mResultTv.setText("文件上传请求结果:\n" + msg.obj);
                    break;
                case 3:
                    mResultTv.setText("JSON请求结果:\n" + msg.obj);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mResultTv = (TextView) findViewById(R.id.result_tv);
        mGetBtn = (Button) findViewById(R.id.get_btn);
        mPostBtn = (Button) findViewById(R.id.post_btn);
        mFileBtn = (Button) findViewById(R.id.file_btn);
        mJsonBtn = (Button) findViewById(R.id.json_btn);

        // 创建HttpClient对象
        PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager();
        connectionManager.setMaxTotal(10);
        connectionManager.setDefaultMaxPerRoute(3);
        ConnManagerParams.setTimeout(connectionManager.getParams(), 10000);
        mHttpClient = new DefaultHttpClient(connectionManager);

        mGetBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 发送GET请求
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message msg = Message.obtain();
                        try {
                            // 创建Http请求对象
                            HttpGet httpGet = new HttpGet("https://www.baidu.com");

                            // 执行Http请求,获取响应对象
                            HttpResponse response = mHttpClient.execute(httpGet);

                            // 解析响应结果
                            String result = EntityUtils.toString(response.getEntity(), "UTF-8");

                            msg.what = 0;
                            msg.obj = result;
                        } catch (IOException e) {
                            e.printStackTrace();
                            msg.obj = e.getMessage();
                        } finally {
                            mHandler.sendMessage(msg);
                        }
                    }
                }).start();
            }
        });

        mPostBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 发送POST请求
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message msg = Message.obtain();
                        try {
                            // 创建Http请求对象
                            HttpPost httpPost = new HttpPost("https://www.baidu.com");

                            // 设置请求参数
                            List params = new ArrayList();
                            params.add(new BasicNameValuePair("username", "test"));
                            params.add(new BasicNameValuePair("password", "123456"));
                            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

                            // 执行Http请求,获取响应对象
                            HttpResponse response = mHttpClient.execute(httpPost);

                            // 解析响应结果
                            String result = EntityUtils.toString(response.getEntity(), "UTF-8");

                            msg.what = 1;
                            msg.obj = result;
                        } catch (IOException e) {
                            e.printStackTrace();
                            msg.obj = e.getMessage();
                        } finally {
                            mHandler.sendMessage(msg);
                        }
                    }
                }).start();
            }
        });

        mFileBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 发送文件请求
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message msg = Message.obtain();
                        try {
                            // 创建Http请求对象
                            HttpPost httpPost = new HttpPost("http://www.example.com/upload");

                            // 创建MultipartEntityBuilder对象,设置字符编码和进度监听器
                            MultipartEntityBuilder builder = MultipartEntityBuilder.create()
                                    .setCharset(Charset.forName("UTF-8"))
                                    .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
                                    .addPart("file", new FileBody(new File("/sdcard/Download/test.jpg"), ContentType.DEFAULT_BINARY))
                                    .addTextBody("name", "test", ContentType.create("text/plain", Charset.forName("UTF-8")))
                                    .setBoundary("----WebKitFormBoundary7MA4YWxkTrZu0gW");

                            // 设置请求参数
                            httpPost.setEntity(builder.build());

                            // 执行Http请求,获取响应对象
                            HttpResponse response = mHttpClient.execute(httpPost);

                            // 解析响应结果
                            String result = EntityUtils.toString(response.getEntity(), "UTF-8");

                            msg.what = 2;
                            msg.obj = result;
                        } catch (IOException e) {
                            e.printStackTrace();
                            msg.obj = e.getMessage();
                        } finally {
                            mHandler.sendMessage(msg);
                        }
                    }
                }).start();
            }
        });

        mJsonBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 发送JSON请求
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message msg = Message.obtain();
                        try {
                            // 创建Http请求对象
                            HttpPost httpPost = new HttpPost("http://www.example.com/json");

                            // 设置请求头和请求参数
                            httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
                            String jsonStr = "{\"name\":\"test\",\"age\":18}";
                            httpPost.setEntity(new StringEntity(jsonStr, "UTF-8"));

                            // 执行Http请求,获取响应对象
                            HttpResponse response = mHttpClient.execute(httpPost);

                            // 解析响应结果
                            String result = EntityUtils.toString(response.getEntity(), "UTF-8");

                            msg.what = 3;
                            msg.obj = result;
                        } catch (IOException e) {
                            e.printStackTrace();
                            msg.obj = e.getMessage();
                        } finally {
                            mHandler.sendMessage(msg);
                        }
                    }
                }).start();
            }
        });
    }
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/300497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-29 12:51
下一篇 2024-12-29 12:51

相关推荐

  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29

发表回复

登录后才能评论