Android HTTP请求方式:HttpClient

news2024/11/25 0:38:14

1.HttpClient使用流程
基本流程:

2.HttpClient使用示例
1)使用HttpClient发送GET请求
直接贴下简单的发送Get请求的代码:

public class MainActivity extends Activity implements OnClickListener {

private Button btnGet;
private WebView wView;
public static final int SHOW_DATA = 0X123;
private String detail = "";

private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        if(msg.what == SHOW_DATA)
        {
            wView.loadDataWithBaseURL("",detail, "text/html","UTF-8","");
        }
    };
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    setView();
}

private void initView() {
    btnGet = (Button) findViewById(R.id.btnGet);
    wView = (WebView) findViewById(R.id.wView);
}

private void setView() {
    btnGet.setOnClickListener(this);
    wView.getSettings().setDomStorageEnabled(true);
}
@Override
public void onClick(View v) {
    if (v.getId() == R.id.btnGet) {
        GetByHttpClient();
    }
}
private void GetByHttpClient() {
    new Thread()
    {
        public void run() 
        {
                try {
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet("http://www.w3cschool.cc/python/python-tutorial.html");
                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    if (httpResponse.getStatusLine().getStatusCode() == 200) {
                        HttpEntity entity = httpResponse.getEntity();
                        detail = EntityUtils.toString(entity, "utf-8");
                        handler.sendEmptyMessage(SHOW_DATA);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        };
    }.start();
}

}
运行截图

另外,如果是带有参数的GET请求的话,我们可以将参数放到一个List集合中,再对参数进行URL编码, 最后和URL拼接下就好了:

List params = new LinkedList();
params.add(new BasicNameValuePair(“user”, “猪小弟”));
params.add(new BasicNameValuePair(“pawd”, “123”));
String param = URLEncodedUtils.format(params, “UTF-8”);
HttpGet httpGet = new HttpGet(“http://www.baidu.com”+“?”+param);
2)使用HttpClient发送POST请求
POST请求比GET稍微复杂一点,创建完HttpPost对象后,通过NameValuePair集合来存储等待提交 的参数,并将参数传递到UrlEncodedFormEntity中,最后调用setEntity(entity)完成, HttpClient.execute(HttpPost)即可;这里就不写例子了,暂时没找到Post的网站,又不想 自己写个Servlet,So,直接贴核心代码吧~

核心代码:

private void PostByHttpClient(final String url)
{
new Thread()
{
public void run()
{
try{
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List params = new ArrayList();
params.add(new BasicNameValuePair(“user”, “猪大哥”));
params.add(new BasicNameValuePair(“pawd”, “123”));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,“UTF-8”);
httpPost.setEntity(entity);
HttpResponse httpResponse = httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity2 = httpResponse.getEntity();
detail = EntityUtils.toString(entity2, “utf-8”);
handler.sendEmptyMessage(SHOW_DATA);
}
}catch(Exception e){e.printStackTrace();}
};
}.start();
}
3.HttpClient抓数据示例(教务系统数据抓取)
其实关于HttpClient的例子有很多,比如笔者曾经用它来抓学校教务系统上学生的课程表: 这就涉及到Cookie,模拟登陆的东西,说到抓数据(爬虫),一般我们是搭配着JSoup来解析 抓到数据的,有兴趣可以自己查阅相关资料,这里贴下笔者毕设app里获取网页部分的关键 代码!大家可以体会下:

HttpClient可以通过下述代码获取与设置Cookie: HttpResponse loginResponse = new DefaultHttpClient().execute(getLogin); 获得Cookie:cookie = loginResponse.getFirstHeader(“Set-Cookie”).getValue(); 请求时带上Cookie:httpPost.setHeader(“Cookie”, cookie);

//获得链接,模拟登录的实现:
public int getConnect(String user, String key) throws Exception {
// 先发送get请求 获取cookie值和__ViewState值
HttpGet getLogin = new HttpGet(true_url);
// 第一步:主要的HTML:
String loginhtml = “”;
HttpResponse loginResponse = new DefaultHttpClient().execute(getLogin);
if (loginResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = loginResponse.getEntity();
loginhtml = EntityUtils.toString(entity);
// 获取响应的cookie值
cookie = loginResponse.getFirstHeader(“Set-Cookie”).getValue();
System.out.println("cookie= " + cookie);
}

// 第二步:模拟登录
// 发送Post请求,禁止重定向
HttpPost httpPost = new HttpPost(true_url);
httpPost.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);

// 设置Post提交的头信息的参数
httpPost.setHeader("User-Agent",
        "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");
httpPost.setHeader("Referer", true_url);
httpPost.setHeader("Cookie", cookie);

// 设置请求数据
List<NameValuePair> params = new ArrayList<NameValuePair>();

params.add(new BasicNameValuePair("__VIEWSTATE",
        getViewState(loginhtml)));// __VIEWSTATE参数,如果变化可以动态抓取获取
params.add(new BasicNameValuePair("Button1", ""));
params.add(new BasicNameValuePair("hidPdrs", ""));
params.add(new BasicNameValuePair("hidsc", ""));
params.add(new BasicNameValuePair("lbLanguage", ""));
params.add(new BasicNameValuePair("RadioButtonList1", "%D1%A7%C9%FA"));
params.add(new BasicNameValuePair("txtUserName", user));
params.add(new BasicNameValuePair("TextBox2", key));
params.add(new BasicNameValuePair("txtSecretCode", "")); // ( ╯□╰ )逗比正方,竟然不需要验证码

// 设置编码方式,响应请求,获取响应状态码:
httpPost.setEntity(new UrlEncodedFormEntity(params, "gb2312"));
HttpResponse response = new DefaultHttpClient().execute(httpPost);
int Status = response.getStatusLine().getStatusCode();
if(Status == 200)return Status;
System.out.println("Status= " + Status);

// 重定向状态码为302
if (Status == 302 || Status == 301) {
    // 获取头部信息中Location的值
    location = response.getFirstHeader("Location").getValue();
    System.out.println(location);
    // 第三步:获取管理信息的主页面
    // Get请求
    HttpGet httpGet = new HttpGet(ip_url + location);// 带上location地址访问
    httpGet.setHeader("Referer", true_url);
    httpGet.setHeader("Cookie", cookie);

    // 主页的html
    mainhtml = "";
    HttpResponse httpResponseget = new DefaultHttpClient()
            .execute(httpGet);
    if (httpResponseget.getStatusLine().getStatusCode() == 200) {
        HttpEntity entity = httpResponseget.getEntity();
        mainhtml = EntityUtils.toString(entity);
    }

}
return Status;

}
4.使用HttpPut发送Put请求
示例代码如下:

public static int PutActCode(String actCode, String licPlate, Context mContext) {
int resp = 0;
String cookie = (String) SPUtils.get(mContext, “session”, “”);
HttpPut httpPut = new HttpPut(PUTACKCODE_URL);
httpPut.setHeader(“Cookie”, cookie);
try {

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("activation_code", actCode));
    params.add(new BasicNameValuePair("license_plate", licPlate));
    httpPut.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
    HttpResponse course_response = new DefaultHttpClient().execute(httpPut);
    if (course_response.getStatusLine().getStatusCode() == 200) {
        HttpEntity entity2 = course_response.getEntity();
        JSONObject jObject = new JSONObject(EntityUtils.toString(entity2));
        resp = Integer.parseInt(jObject.getString("status_code"));
        return resp;
    }
} catch (Exception e) {
    e.printStackTrace();
}
return resp;

}请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是OSPF被动接口?如何配置?华为、思科、瞻博网络三厂商命令来了

OSPF&#xff08;开放最短路径优先&#xff09;是一种常用的动态路由协议&#xff0c;用于在大型网络中实现路由选择。在OSPF中&#xff0c;被动接口是一种特殊类型的接口&#xff0c;它被用来监测网络中的邻居关系&#xff0c;并接收来自邻居发送的Hello消息。被动接口不主动发…

华为OD机试之在字符串中找出连续最长的数字串(含“+-”号)(Java源码)

在字符串中找出连续最长的数字串(含“”号) 输入描述 请在一个字符串中找出连续最长的数字串&#xff0c;并返回这个数字串。 如果存在长度相同的连续数字串&#xff0c;返回最后一个。 如果没有符合条件的字符串&#xff0c;返回空字符串””。 注意&#xff1a; 数字串可以由…

Ansible进阶2——角色管理

文章目录 一、角色1.1 获取角色方式1.2 角色结构1.3 定义变量和默认变量1.4 使用方法1.5 控制playbook中的任务执行流程 二、红帽企业Linux系统角色2.1 常见系统角色2.2 使用系统时间同步角色 三、自定义角色3.1 创建角色目录结构3.2 编写角色内容3.3 编写总结 四、ansible gal…

【C++】内存管理的基本操作,new与delete的实现原理以及operator new与operator delete函数

文章目录 前言一、new,delete操作内置类型二、new/delete操纵自定义类型3. operator new与operator delete函数4. new/delete实现原理4.malloc/free和new/delete的区别 前言 程序中内存的划分&#xff1a; 栈又叫堆栈–非静态局部变量/函数参数/返回值等等&#xff0c;栈是向…

高考必胜,归来仍是少年!

高考必胜&#xff0c;归来仍是少年&#xff01; 这是小索奇专门为高考生写的文章高考生 我以前给大家弄过一些免费的付费资料&#xff0c;现在看到后台很多伙伴们都在寻找资料&#xff0c;一些没有充分准备的小伙伴此刻一定很匆忙吧&#xff01; 我想对大家说&#xff1a; 高…

基于 FFMPEG 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)

系列文章目录 基于 FFMPEG 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成 文章目录 系列文章目录前言基础知识视频&#xff0c;你所看到的&#xff01;音频 - 你所听到的声音编解码器 - 压缩数据容器 - 存放音频和视频的地方 解封…

vue3.0与vue2.0的区别简记(基于官方文档)

vue3.0与vue2.0的区别简记&#xff08;基于官方文档&#xff09; 基于vue3.0和vue2.0官方文档简单记录vue3.0版本和2.0版本的区别。 一直没有看文档的习惯&#xff08;就是不爱学习&#xff0c;现在吃了没文化的亏&#xff09;&#xff0c;遇到问题才去补充点食粮&#xff0c…

祝2023高考考生高考顺利!金榜题名

前言&#xff1a;光阴似箭&#xff0c;岁月如梭。明天就是全国每年一次的高考了&#xff0c;我也即将结束我的大一生活成为一名大二的小学长啦嘿嘿。而我今天呢主要是想祝马上要高考的学弟学妹们高考顺利&#xff0c;金榜题名&#xff0c;并且借此机会顺便讲讲我的高考前后的故…

解决python通过pip离线安装flask,numpy报错解决(centos)

1. 离线安装Python https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz 解压&#xff0c;编译&#xff0c;安装 tar xzvf Python-3.7.1.tgz ./configuremakemake install 离线环境下如果系统不是完整版安装编译会报错&#xff0c;需要解决依赖问题&#xff0c;如下&am…

5 种常见的 Linux 打包类型:tar、gzip、bzip2、zip 、 7z

在 Linux 系统中&#xff0c;打包和压缩文件是常见的操作。不同的打包类型适用于不同的用途和需求。本文将详细介绍 5 种常见的 Linux 打包类型&#xff0c;包括tar、gzip、bzip2、zip 和 7z&#xff0c;以及它们的特点、使用方法和适用场景。 1. tar tar&#xff08;tape arc…

音悦台项目测试报告

文章目录 项目背景项目功能测试计划与设计功能测试自动化测试 测试结果功能测试结果UI自动化测试结果 项目背景 现如今人们的生活压力大&#xff0c;容易使人疲惫&#xff0c;为了使得人们在闲暇之余可以听音乐放松&#xff0c;为此设计出一款轻量的听音乐网站&#xff0c;快速…

centos安装部署Kubernetes(k8s)步骤使用kubeadm方式

文章目录 1、修改系统配置2、安装docker应用3. 拉取docker镜像4、cri-dockerd安装5、安装kubeadm和kubelet6、配置flannel网络插件7、Node节点加入集群操作 机器地址&#xff1a; 192.168.0.35 k8s-master 192.168.0.39 k8s-node1 192.168.0.116 k8s-node2 1、修改系统配置 修…

Web应用技术(第十六周/持续更新)

本次联系基于how2j的教程完成对SpringBoot的初步学习。 初识Springboot 学习导入&#xff1a;1.第一个基于SpringBoot的项目&#xff1a;&#xff08;1&#xff09;application.java&#xff1a;该文件中的核心代码&#xff1a; &#xff08;2&#xff09;HelloController.jav…

一. ATR技术指标的定义与运用

一. ATR的定义 1. 什么是ATR ATR英文全名是Average true range&#xff0c;翻译过来就是平均真实波幅&#xff0c;这个指标主要用来衡量最近N天TR(真实波幅)的平均值。 2. ATR相关计算公式 T R [ ( 最高价 − 最低价 ) &#xff0c; ( 前一次收盘价 − 最高价 ) &#xff0…

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和…

OAuth2.0 授权 OpenID Connect 身份认证

文章目录 OAuth2.0历史由来名词解释授权码模式&#xff08;authorization code 最常用&#xff09;先换取code&#xff0c;再根据 code 换取 access_token原因 简化模式&#xff08;implicit&#xff09;密码模式&#xff08;resource owner password credentials&#xff09;客…

【P49】JMeter 查看结果树(View Results Tree)

文章目录 一、查看结果树&#xff08;View Results Tree&#xff09;参数说明二、准备工作三、测试计划设计 一、查看结果树&#xff08;View Results Tree&#xff09;参数说明 可以查看取样器的请求参数、返回结果 使用场景&#xff1a;一般在调试测试计划期间用来查看取样…

Bigdata1234.cn课堂测试

Java源文件中有一个公共类名称为Test&#xff0c;则该源文件名必须是&#xff1a;Test.java . Java中的基本数据类型共有8个&#xff1a;byte、short、int、long、float、double、char、boolean。 . Eclipse中内容补全的快捷键是alt/ Eclipse 中自动导包的快捷键是 Ctrl Sh…

MySQL数据库从入门到精通学习第8天(表数据的查询)

表数据的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大&#xff0c;是最常用的查询语句。他具有一个固定的格式&#xff0c;如下&#xff1a; SELECT 查询的内容 FROM 数据…

【Mysql数据库从0到1】-入门基础篇--mysql 多表查询

【Mysql数据库从0到1】-入门基础篇--mysql 多表查询 &#x1f53b;一、mysql 多表查询1.1 &#x1f343; 7种sql joins 的实现1.2 &#x1f343; 错误写法---笛卡尔积错误1.3 &#x1f343; 正确的多表select写法 &#x1f53b;二、内连接( inner) join&#x1f53b;三、 外连接…