Android中Http的Get与Post
来源:互联网 发布:为什么蔬菜不好吃知乎 编辑:程序博客网 时间:2024/06/02 02:32
网上已经有很多关于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
0 0
- Android中Http的Get与Post
- http中get与post的区别??
- http中get与post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- http中get与post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中Get与Post的区别
- HTTP中GET与POST的区别
- http中get与post的区别
- [编程语言] 使用杂记
- 视频打卡机是否可以应用了?
- Recipient List
- Kmeans及其改进算法的Matlab解析与实现
- Spring装配Bean的3种方式解析
- Android中Http的Get与Post
- C# 窗体动态显示 Label文字
- 程序员必会算法系列--基本排序7个
- 分治——大整数乘法
- java 开发环境搭建配置笔记
- getContextPath、getServletPath、getRequestURI的区别
- Publish Subscribe Channel 订阅
- 2-5 分数化小数
- QT系列:生成UUID