用代码模拟浏览器的行为

* 轻量级的开源的框架

* Android在6.0 23 以后移除了httpclient ,所以开发中用的少了

* 编写步骤:

1. 打开浏览器

2. 输入网址

3. 敲回车


HttpClient中的类:

HttpClient :想服务器提交数据或者接受服务器返回的数据
NameValuePair :post方式提交数据的键值对
UrlEncodedFormEntity
:经过form表单编码的数据实体
HttpResponse :Http响应的
响应头和响应体
StatusLine :状态行
HttpEntity :服务器返给客户端的数据实体

GET请求示例代码: 

import java.io.InputStream;
import java.net.URLEncoder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText etPwd;
private EditText etQQ;
private String pwd;
private String qq;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etPwd = (EditText) findViewById(R.id.et_pwd);
etQQ = (EditText) findViewById(R.id.et_qq);
}
/**
* 1. 在子线程中进行网络通讯 2. 获取服务器返回的信息 3. 用Handler去展示服务器返回的信息
*/
public void login(View v) {
pwd = etPwd.getText().toString().trim();
qq = etQQ.getText().toString().trim();
if (TextUtils.isEmpty(pwd) || TextUtils.isEmpty(qq)) {
Toast.makeText(this, "亲,请输入QQ号码或者密码! :) ", 0).show();
return;
} // 开启子线程 new Thread() {
public void run() {
requestNetWork();
};
}.start();
}
/**
* 网络通信
*/
private void requestNetWork() {
try {
String path = "http://192.168.25.70:8080/web/LoginServlet?" + "qq="
+ URLEncoder.encode(qq) + "&pwd=" + URLEncoder.encode(pwd, "utf-8");
// 1. 打开浏览器
HttpClient client = new DefaultHttpClient();
// 2. 输入网址
HttpGet urlGet = new HttpGet(path);
// 3. 敲回车
HttpResponse response = client.execute(urlGet);
//状态行
StatusLine statusLine = response.getStatusLine();
//状态码
int code = statusLine.getStatusCode();
if (code == 200) {
// * 2xxx 请求成 3xxx重定向 4xxx资源错误 5xxx服务器错误
// 获取服务器返回的二进制输入流
//响应体
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
// 把流转成字符串
String text = StringUtils.parseStream2String(is);
showToast(text);
} else {
showToast(code + "");
}
} catch (Exception e) {
e.printStackTrace();
showToast("服务器忙!");
}
}
/**
* 在任意线程弹土司
*/
public void showToast(final String text) {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, text, 0).show();
}
});
}
}

POST请求示例代码:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity { private EditText etPwd;
private EditText etQQ;
private String pwd;
private String qq;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etPwd = (EditText) findViewById(R.id.et_pwd);
etQQ = (EditText) findViewById(R.id.et_qq);
}
/**
* 1. 在子线程中进行网络通讯
* 2. 获取服务器返回的信息
* 3. 用Handler去展示服务器返回的信息
*/
public void login(View v) {
pwd = etPwd.getText().toString().trim();
qq = etQQ.getText().toString().trim();
if (TextUtils.isEmpty(pwd) || TextUtils.isEmpty(qq)) {
Toast.makeText(this, "亲,请输入QQ号码或者密码! :) ", 0).show();
return;
}
// 开启子线程
new Thread() {
public void run() {
requestNetWork();
};
}.start();
}
/**
* 网络通信
*/
private void requestNetWork() {
try {
String path = "http://192.168.3.100:8080/web/LoginServlet";
// 1. 打开浏览器
HttpClient client = new DefaultHttpClient();
// 2. 输入网址
HttpPost urlPost = new HttpPost(path);
// String data = "qq="+URLEncoder.encode(qq)+"&pwd="+URLEncoder.encode(pwd, "utf-8");
//要提交的数据
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("qq", qq));
parameters.add(new BasicNameValuePair("pwd", pwd));
//经过Url表单编码
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(parameters,"utf-8");
//设置要提交的数据
urlPost.setEntity(urlEncodedFormEntity);
// 3. 敲回车
HttpResponse response = client.execute(urlPost);
//状态行
StatusLine statusLine = response.getStatusLine();
//状态码
int code = statusLine.getStatusCode();
if (code == 200) {
// * 2xxx 请求成 3xxx重定向 4xxx资源错误 5xxx服务器错误
// 获取服务器返回的二进制输入流
//响应体
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
// 把流转成字符串
String text = StringUtils.parseStream2String(is);
showToast(text); } else { showToast(code + "");
}
} catch (Exception e) {
e.printStackTrace();
showToast("服务器忙!");
}
}
/**
* 在任意线程弹土司
*/ public void showToast(final String text) {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, text, 0).show();
}
});
}
}

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
/**
* 操作字符串
*/ public class StringUtils {
/**
* 从流中转成字符串
* @param is
* 输入流
* @return null表示失败
*/
public static String parseStream2Str(InputStream is) {
//内存输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[1024*8];
try {
while((len = is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
return new String(baos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

HttpClient提交数据的更多相关文章

  1. Android 采用HttpClient提交数据到服务器

    在前几篇文章中<Android 采用get方式提交数据到服务器><Android 采用post方式提交数据到服务器>介绍了android的两种提交数据到服务器的方法 本文继续介 ...

  2. Android(java)学习笔记211:采用httpclient提交数据(qq登录案例)

    1.Apache -Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包 ...

  3. Android(java)学习笔记154:采用HttpClient提交数据(qq登录案例)

    1.Apache -Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包 ...

  4. 采用httpclient提交数据到服务器

    1)Get提交数据 效果演示:

  5. nodejs的http.request使用post方式提交数据请求

    官方api文档 http://nodejs.org/docs/v0.6.1/api/http.html#http.request虽然也有POST例子,但是并不完整. 直接上代码:http_post.j ...

  6. 使用异步httpclient框架做get,post提交数据

    1.将异步httpclient框架导入 下载地址:http://download.csdn.net/detail/sinat_32804317/9555641 2.代码实现 public class ...

  7. CInternetSession CHttpFile Post提交数据

    //给指定url发请求, 返回请求后的结果 string CAutoPatchDlg::SendURLPost(string strServerName, string strFormActionUr ...

  8. Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)

    1.前面提到Http的get/post方式  . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善 ...

  9. Android 使用Post方式提交数据(登录)

    在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POS ...

随机推荐

  1. 第六章、Cookies和Session

    目录 第六章.Cookies和Session 一.来源 二.cookie工作原理 工作原理: 三.session的工作原理 工作原理: 四.如何操作cookie 服务端常见的cookie操作 五.案例 ...

  2. linux下搭建redis内网端口映射工具-rinetd

    最近在工作中使用到了redis缓存,用来提某些业务场景的计算速度和某些情况下的操作频率限制,客户端工具使用了redisDesktopmanager来管理,在本机操作测试的时候,是没有问题的.但是将系统 ...

  3. 牛客练习赛53 E 老瞎眼 pk 小鲜肉 (线段树,思维)

    链接:https://ac.nowcoder.com/acm/contest/1114/E来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...

  4. marquee标签实现跑马灯效果--无缝滚动

    今天在做微信端的大转盘抽奖时,想把所有用户的抽奖记录做成无缝滚动的效果,无奈我的js功底太差,一时想不出实现的方法,便百度各种相似效果.但无意中发现了一个html标签——<marquee> ...

  5. Python单例模式(Singleton)的N种实现

    很多初学者喜欢用全局变量,因为这比函数的参数传来传去更容易让人理解.确实在很多场景下用全局变量很方便.不过如果代码规模增大,并且有多个文件的时候,全局变量就会变得比较混乱.你可能不知道在哪个文件中定义 ...

  6. Anaconda 下 Jupyter 更改默认启动路径和默认浏览器

    1.Jupyter 更改默认启动路径方法 输入jupyter notebook --generate-config 会生成jupyter_notebook_config.py 找到文件,并打开 将 # ...

  7. Java8-Stream-No.04

    import java.util.OptionalInt; import java.util.stream.IntStream; public class Streams4 { public stat ...

  8. codeforces#562 Div2 C---Increasing by modulo【二分】

    题目:http://codeforces.com/contest/1169/problem/C 题意: 有n个数,每次可以选择k个,将他们+1并对m取模.问最少进行多少次操作,使得序列是非递减的. 思 ...

  9. 2、django后端:课程表、课程详细表

    1.课程表录入数据 有些人卖接口,接口就是 数据 1.课程表 2张表+3张表 分布式数据库分表 数据库优化 垂直分表 1000w条数据,999w条数据不常看,经常查的1w条数据放在另一个表 水平分表 ...

  10. RDLC 传参 报表出现错误 (未解决)

    经过测试  可以用的 带传参的  RDLC  在vs2019上 能正常运行 但在vs2019上剪切后,保存, 运行就会报An error 错误, ctr+z 全部 撤销后 保存     一样会报  这 ...