android客户端向服务器通信一般有以下选择: 1.传统的java.net.HttpURLConnection类 2.apache的httpClient框架(已纳入android.jar中,可直接使用) 3.github上的开源框架async-http(基于httpClient) ---------------------------------------------------------------------------------- 下面分别记录这三种方式的使用,以后忘了就来看看~ 下面开始贴代码
传统方式:
/**     * 以get方式向服务端发送请求,并将服务端的响应结果以字符串方式返回。如果没有响应内容则返回空字符串     *      * @param url 请求的url地址     * @param params 请求参数     * @param charset url编码采用的码表     * @return     */    public static String getDataByGet(String url,Map<String,String> params,String charset)    {        if(url == null)        {            return "";        }        url = url.trim();        URL targetUrl = null;        try        {            if(params == null)            {                targetUrl = new URL(url);            }            else            {                StringBuilder sb = new StringBuilder(url+"?");                for(Map.Entry<String,String> me : params.entrySet())                {//                    解决请求参数中含有中文导致乱码问题                    sb.append(me.getKey()).append("=").append(URLEncoder.encode(me.getValue(),charset)).append("&");                }                sb.deleteCharAt(sb.length()-1);                targetUrl = new URL(sb.toString());            }            Log.i(TAG,"get:url----->"+targetUrl.toString());//打印log            HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection();            conn.setConnectTimeout(3000);            conn.setRequestMethod("GET");            conn.setDoInput(true);            int responseCode = conn.getResponseCode();            if(responseCode == HttpURLConnection.HTTP_OK)            {                return stream2String(conn.getInputStream(),charset);            }        } catch (Exception e)        {            Log.i(TAG,e.getMessage());        }        return "";/**     *  以post方式向服务端发送请求,并将服务端的响应结果以字符串方式返回。如果没有响应内容则返回空字符串     * @param url 请求的url地址     * @param params 请求参数     * @param charset url编码采用的码表     * @return     */    public static String getDataByPost(String url,Map<String,String> params,String charset)    {        if(url == null)        {            return "";        }        url = url.trim();        URL targetUrl = null;        OutputStream out = null;        try        {            targetUrl = new URL(url);            HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection();            conn.setConnectTimeout(3000);            conn.setRequestMethod("POST");            conn.setDoInput(true);            conn.setDoOutput(true);                        StringBuilder sb = new StringBuilder();            if(params!=null && !params.isEmpty())            {                for(Map.Entry<String,String> me : params.entrySet())                {//                    对请求数据中的中文进行编码                    sb.append(me.getKey()).append("=").append(URLEncoder.encode(me.getValue(),charset)).append("&");                }                sb.deleteCharAt(sb.length()-1);            }            byte[] data = sb.toString().getBytes();            conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");            conn.setRequestProperty("Content-Length", String.valueOf(data.length));            out = conn.getOutputStream();            out.write(data);                        Log.i(TAG,"post:url----->"+targetUrl.toString());//打印log                        int responseCode = conn.getResponseCode();            if(responseCode == HttpURLConnection.HTTP_OK)            {                return stream2String(conn.getInputStream(),charset);            }        } catch (Exception e)        {            Log.i(TAG,e.getMessage());        }        return "";    }/**     * 将输入流对象中的数据输出到字符串中返回     * @param in     * @return     * @throws IOException     */    private static String stream2String(InputStream in,String charset) throws IOException    {        if(in == null)            return "";        byte[] buffer = new byte[1024];        ByteArrayOutputStream bout = new ByteArrayOutputStream();        int len = 0;        while((len = in.read(buffer)) !=-1)        {            bout.write(buffer, 0, len);        }        String result = new String(bout.toByteArray(),charset);        in.close();        return result;    }
使用httpClient:
package cn.edu.chd.httpclientdemo.http;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URLEncoder;import java.util.ArrayList;import java.util.List;import java.util.Map;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.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import android.util.Log;/** * @author Rowand jj * *http工具类,发送get/post请求 */public final class HttpUtils{    private static final String TAG = "HttpUtils";    private static final String CHARSET = "utf-8";    private HttpUtils(){}    /**     * 以get方式向指定url发送请求,将响应结果以字符串方式返回     * @param uri     * @return 如果没有响应数据返回null     */    public static String requestByGet(String url,Map<String,String> data)    {        if(url == null)            return null;//        构建默认http客户端对象        HttpClient client = new DefaultHttpClient();        try        {//            拼装url,并对中文进行编码            StringBuilder sb = new StringBuilder(url+"?");            if(data != null)            {                for(Map.Entry<String,String> me : data.entrySet())                {                    sb.append(URLEncoder.encode(me.getKey(),CHARSET)).append("=").append(URLEncoder.encode(me.getValue(),"utf-8")).append("&");                }                sb.deleteCharAt(sb.length()-1);            }            Log.i(TAG, "[get]--->uri:"+sb.toString());//            创建一个get请求            HttpGet get = new HttpGet(sb.toString());//            执行get请求,获取http响应            HttpResponse response = client.execute(get);//            获取响应状态行            StatusLine statusLine = response.getStatusLine();            //请求成功            if(statusLine != null && statusLine.getStatusCode() == 200)            {//                获取响应实体                HttpEntity entity = response.getEntity();                if(entity != null)                {                    return readInputStream(entity.getContent());                }            }        } catch (Exception e)        {            e.printStackTrace();        }        return null;    }    /**     * 以post方式向指定url发送请求,将响应结果以字符串方式返回     * @param url     * @param data 以键值对形式表示的信息     * @return     */    public static String requestByPost(String url,Map<String,String> data)    {        if(url == null)            return null;        HttpClient client = new DefaultHttpClient();        HttpPost post = new HttpPost(url);        List<NameValuePair> params = null;        try        {            Log.i(TAG, "[post]--->uri:"+url);            params = new ArrayList<NameValuePair>();            if(data != null)            {                for(Map.Entry<String,String> me : data.entrySet())                {                    params.add(new BasicNameValuePair(me.getKey(),me.getValue()));                }            }//            设置请求实体            post.setEntity(new UrlEncodedFormEntity(params,CHARSET));//            获取响应信息            HttpResponse response = client.execute(post);            StatusLine statusLine = response.getStatusLine();            if(statusLine!=null && statusLine.getStatusCode()==200)            {                HttpEntity entity = response.getEntity();                if(entity!=null)                {                    return readInputStream(entity.getContent());                }            }        } catch (Exception e)        {            e.printStackTrace();        }        return null;    }        /**     * 将流中的数据写入字符串返回     * @param is     * @return     * @throws IOException     */    private static String readInputStream(InputStream is) throws IOException    {        if(is == null)            return null;        ByteArrayOutputStream bout = new ByteArrayOutputStream();        int len = 0;        byte[] buf = new byte[1024];        while((len = is.read(buf))!=-1)        {            bout.write(buf, 0, len);        }        is.close();        return new String(bout.toByteArray());    }    /**     * 将流中的数据写入字符串返回,以指定的编码格式     * 【如果服务端返回的编码不是utf-8,可以使用此方法,将返回结果以指定编码格式写入字符串】     * @param is     * @return     * @throws IOException     */    private static String readInputStream(InputStream is,String charset) throws IOException    {        if(is == null)            return null;        ByteArrayOutputStream bout = new ByteArrayOutputStream();        int len = 0;        byte[] buf = new byte[1024];        while((len = is.read(buf))!=-1)        {            bout.write(buf, 0, len);        }        is.close();        return new String(bout.toByteArray(),charset);    }}
3.使用async-http框架,这个如果使用的话需要导入框架的jar包或者把源码拷到工程下: 这个框架的好处是每次请求会开辟子线程,不会抛networkonmainthread异常,另外处理器类继承了Handler类,所以可以在里面更改UI。 注:这里使用的是最新的1.4.4版。 ·
/**     * 使用异步http框架发送get请求     * @param path get路径,中文参数需要编码(URLEncoder.encode)     */    public void doGet(String path)    {        AsyncHttpClient httpClient = new AsyncHttpClient();        httpClient.get(path, new AsyncHttpResponseHandler(){            @Override            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody)            {                if(statusCode == 200)                {                    try                    {//                        此处应该根据服务端的编码格式进行编码,否则会乱码                        tv_show.setText(new String(responseBody,"utf-8"));                    } catch (UnsupportedEncodingException e)                    {                        e.printStackTrace();                    }                }            }        });    }    /**     * 使用异步http框架发送get请求     * @param path      */    public void doPost(String path)    {        AsyncHttpClient httpClient = new AsyncHttpClient();        RequestParams params = new RequestParams();        params.put("paper","中文");//value可以是流、文件、对象等其他类型,很强大!!        httpClient.post(path, params, new AsyncHttpResponseHandler(){            @Override            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody)            {                if(statusCode == 200)                {                    tv_show.setText(new String(responseBody));                }            }        });    }
上面那个tv_show是一个TextView控件。



更多相关文章

  1. android touch事件解析
  2. Android中onContextItemSelected不响应
  3. Android(安卓)startActivityForResult的使用
  4. android三级联动、四级联动(地区选择)
  5. 13-7-13如何修改android的title
  6. Android(安卓)返回键连续点击两次退出应用
  7. 安卓9.0 http请求数据失败解决办法
  8. Android中的dispatchTouchEvent()、onInterceptTouchEvent()和on
  9. Android(安卓)中与 Touch 事件分发和消费机制

随机推荐

  1. Android adb forward转发TCP端口连接数据
  2. busybox应用于android系统
  3. Unity5与Android交互通信(使用Android Stu
  4. Android的webview研究
  5. android之数据库的使用案例
  6. 深刻解析 Android 的 AIDL
  7. android应用层学习经验
  8. Android(安卓)之采用execSQL和rawQuery方
  9. Android Camera 系统框架分析
  10. [Android进阶]Android消息机制