android客户端与服务端交互的三种方式

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;
    }</string,string></string,string></string,string></string,string>
使用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);
    }
}</string,string></namevaluepair></namevaluepair></string,string></string,string></string,string>
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控件。
时间: 2024-10-07 07:14:22

android客户端与服务端交互的三种方式的相关文章

Android客户端与服务端交互之登陆示例

今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台使用简单的servlet,支持GET或POST.这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功. servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径 我是在myEclipse上创建的一个we

Android WebView与服务端交互Demo

使用WebView可以让Android端的开发工作大量减少,原因是在服务端可以为其做一定的工作,下面这个小Demo就实现了从Android客户端与服务端的交互.我这里客户端使用的工具是Eclipse,服务端使用MyEclipse. 实现效果图: 客户端: 点击登录按钮后,页面跳转,而在服务端Console中看到如下(只看最后一行即可): 可以看到服务端收到了客户端发过来的用户名:yao. 源代码: 客户端: activity_main: <RelativeLayout xmlns:android

Android客户端与服务端(jsp)之间json的传输与解析【附效果图附源码】

最近有个项目需要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,可以实现基本功能:android客户端发送json到服务端,服务端使用jsp接收,解析后以json的形式返回给客户端,客户端接收打印,先看看运行的效果截图,源码会在文章的末尾给出. 1.服务端:接收到json后解析打印,然后发送json到客户端 2.客户端,收到服务端返回的json后打印 简单的介绍下源码: 服务端使用json.jsp来接收解析客户端传过来的json,json的解析需要使用lib目录

Android 客户端与服务端JSP相互传递中文

为了兼容简体.繁体及其他语系,推荐使用UTF-8编码. 首选,我们看看Android端应该怎么做: 在发送前,应该对参数值要进行UTF-8编码,我写了一个static的 转换函数,在做发送动作前用它将参数值转换成utf8编码: public class NetUtil { static public String toUtf8Url(String value) { try { return java.net.URLEncoder.encode(value, "utf8"); } cat

Android中WebView的JavaScript代码和本地代码交互的三种方式

一.Android中WebView的漏洞分析 最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视,关于这个漏洞,这里就不多做解释了,可能有的同学早就了解了,本来想写一篇文章详细介绍一下,但是网上的知识太多了,而且都很详细,就没弄了,这里大致简单明了的说几句: 第一.漏洞产生的原因 这个漏洞导致的原因主要是因为Android中WebView中的JS访问本地方法的方式存在缺陷,我们做过交互的都知

XFire构建服务端Service的两种方式

1.原声构建:2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方式

python3中实现客户端与服务端交互发送文件

在python3中实现客户端与服务端程序交互,从客户端发送文件到服务端 客户端代码:client.py #!/usr/bin/env python #_*_ encoding=utf-8 _*_ import socket,sys,os ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.connect(ip_port) container = {'key':'','data':''} while True:     input_data =

简单的android客户端servlet服务端的交互

android客户端通过GET方式发送数据到服务端,服务端获得数据后,从服务端获取数据库里的信息,并以JSON数据格式返回. 1.GET方式传参的格式: http://127.0.0.1/AndroidService/android/upload?title=aaa&timelength=90的形式 参数是?后的title=aaa&timelength=90.多个参数用&连接. 2.连接服务器发送请求参数并获得服务器返回的数据,客户端获得数据后,主要是对JSON数据的一些解析. /

android 38 Abdroid客户端和服务端交互

服务端: package com.sxt.day05; import java.io.IOException; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest