网上已经有很多关于http的get与post的文章,不过,我还是将我的实现方式写了出来,主要的区别在于,我的调用函数,有几个优点:
1,做了一个工具类,集成到工程中比较方便;
2,可以直接调用,不需要new一个对象;
3,将返回数据的处理,转到调用者的handler中来处理。
下面是一个HttpUtils的工具类,里面就是两个函数:httpGet,httpPost。
package com.develop.app.httptest;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class HttpUtils {
public static int httpGet(final Context context, final String urlPath, final Handler mHandler, final int msgWhat) {
new Thread() {
@Override
public void run() {
int statusCode = -1;
String content = "";
// ---------------------请求数据-----------------------
try {
URL url = new URL(urlPath.trim());
Log.i("logB", "send url=" + url.toString());
//打开连接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
statusCode = urlConnection.getResponseCode();
if (200 == urlConnection.getResponseCode()) {
//得到输入流
InputStream is = urlConnection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while (-1 != (len = is.read(buffer))) {
baos.write(buffer, 0, len);
baos.flush();
}
content = baos.toString("utf-8");
sendHandler(context, mHandler, msgWhat, content, statusCode);
} else {
sendHandler(context, mHandler, msgWhat, content, statusCode);
}
} catch (MalformedURLException e) {
sendHandler(context, mHandler, msgWhat, content, statusCode);
e.printStackTrace();
} catch (IOException e) {
sendHandler(context, mHandler, msgWhat, content, statusCode);
e.printStackTrace();
}
}
}.start();
return 0;
}
public static void httpPost(final Context context,final String urlPath, final String content, final Handler handler, final int msgWhat){
new Thread()
{
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
URL url;
try {
url = new URL(urlPath);
Log.i("logB","content="+content);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);//5
conn.setReadTimeout(10000);
conn.setDoOutput(true);// 设置允许输出
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");// "Fiddler"
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Charset", "UTF-8");
OutputStream os = conn.getOutputStream();
os.write(content.getBytes());
os.close();
/* 服务器返回的响应码 */
int code = conn.getResponseCode();
Log.i("logB","code="+code);
if (code == 200) {
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "UTF-8"));
String retData = null;
String responseData = "";
while ((retData = in.readLine()) != null) {
responseData += retData;
}
Log.i("logB","responseData="+responseData);
in.close();
sendHandler(context,handler,msgWhat,responseData,code);
} else {
sendHandler(context,handler,msgWhat,"",code);
}
} catch (MalformedURLException e) {
e.printStackTrace();
Log.i("logB","MalformedURLException");
sendHandler(context,handler,msgWhat,"",-1);
} catch (IOException e) {
e.printStackTrace();
Log.i("logB","IOException");
sendHandler(context,handler,msgWhat,"",-1);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
sendHandler(context,handler,msgWhat,"",-1);
}
Looper.loop();
}
}.start();
}
private static void sendHandler(Context context, Handler mHandler, int msgWhat, String content, int statusCode){
if (context != null) {
Message msg = mHandler.obtainMessage(msgWhat);
Bundle bundle = new Bundle();
bundle.putString("content", content); // 往Bundle中存放数据
bundle.putInt("statusCode", statusCode); // 往Bundle中存放statusCode
msg.setData(bundle);
mHandler.sendMessage(msg);
}
}
}
调用的Activity中的代码如下:
package com.develop.app.httptest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.json.JSONObject;
public class MainActivity extends Activity {
private Button btn_register, btn_login;
private EditText et_user_name, et_password;
//防止按钮连续点击
private static long lastClickTime=0;
private boolean islanServertest=true;//false
static final int UPDATE_REGISTER =1001;
static final int QUERY_LOGIN =1002;
/**
* 创建一个Handler实例,用于接收支付查询返回消息
*/
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String text;
int statusCode;
switch (msg.what) {
case UPDATE_REGISTER:
statusCode = msg.getData().getInt("statusCode");
Log.i("logB","QUERY_REGISTER: statusCode="+statusCode);
if(statusCode==200){
text = msg.getData().getString("content");
if((text!=null) && (text.length()>2)){
text = text.replace("\"", "");
}
Log.i("logB","get content="+text);
} else if(statusCode == 500){
Toast.makeText(MainActivity.this,"服务器异常,请稍后重试",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this,"网络错误,请重试",Toast.LENGTH_SHORT).show();
}
break;
case QUERY_LOGIN:
statusCode = msg.getData().getInt("statusCode");
Log.i("logB","QUERY_LOGIN: statusCode="+statusCode);
if(isFinishing()){
Log.i("logB","activity isFinishing");
return;
}
String strHintTryAgain="";
if(statusCode==200){
try {
text = msg.getData().getString("content");//content;
Log.i("logB", "get content=" + text);
JSONObject jb = new JSONObject(text);
String result = jb.getString("result");
if (result.equals("fail")) {
strHintTryAgain = "注册失败,请重试";
} else if (result.equals("success")) {
strHintTryAgain = "注册成功!";
} else {
strHintTryAgain = "信息提交中心,网络错误,请重试";
}
} catch (Exception e){
e.printStackTrace();
}
} else if(statusCode == 500){
strHintTryAgain = "服务器异常,请稍后重试";
} else {
strHintTryAgain = "网络错误,请重试";
}
Toast.makeText(MainActivity.this, strHintTryAgain, Toast.LENGTH_SHORT).show();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
et_user_name = (EditText) findViewById(R.id.et_user_name);
et_password = (EditText) findViewById(R.id.et_password);
btn_register = (Button) findViewById(R.id.btn_register);
btn_login = (Button) findViewById(R.id.btn_login);
btn_register.setOnClickListener(new LoginOnClickListener());
btn_login.setOnClickListener(new LoginOnClickListener());
}
// 登录事件
public class LoginOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
if (v == btn_register) {
//若是连续点击,只响应第一次
if(isContinuousClick()){
return;
}
try {
String strUserName = et_user_name.getText().toString().trim();
String strPassword = et_password.getText().toString().trim();
StringBuilder sb = new StringBuilder();
String url;
if(islanServertest) {
sb.append("name=" + strUserName);
sb.append("&password=" + strPassword);
Log.i("logB", "params=" + sb.toString());
url = "http://192.168.100.100:8080/WebTest/api/register";
} else {
url = "http://www.baidu.com";
}
Log.i("logB","url="+url);
HttpUtils.httpPost(MainActivity.this,
url,
sb.toString(),
mHandler,
UPDATE_REGISTER
);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if(v == btn_login){
//若是连续点击,只响应第一次
if(isContinuousClick()){
return;
}
String strUserName = et_user_name.getText().toString().trim();
String strPassword = et_password.getText().toString().trim();
StringBuilder sb = new StringBuilder();
String url;
if(islanServertest) {
sb.append("name=" + strUserName);
sb.append("&password=" + strPassword);
Log.i("logB", "params=" + sb.toString());
url = "http://192.168.100.100:8080/WebTest/api/login"+"?"+sb.toString();
} else {
url = "http://www.baidu.com";
}
Log.i("logB","url="+url);
HttpUtils.httpGet(MainActivity.this,
url,
mHandler,
QUERY_LOGIN
);
}
}
}
private boolean isContinuousClick(){
//若连续点击,只响应第一次,并且提示。只提示第一次的连续点击,避免长时间显示提示信息。
//Toast.LENGTH_LONG(3.5秒)和Toast.LENGTH_SHORT(2秒)
long time = System.currentTimeMillis();
if ( time - lastClickTime < 2000) {
Log.i("logB","isFastDoubleClick, ignore this click");
return true;
}
lastClickTime = time;
return false;
}
}
说明:
我定义了一个成员变量 islanServertest,来切换是否在本地局域网测试,还是在internet上测试。
private boolean islanServertest=true;//false
若是internet,使用的是百度网站;若是局域网,使用的是一个本地的服务器,将在下一篇博客中说明搭建的方法。
本文demo见如下地址:
http://download.csdn.net/detail/lintax/9777979