Android通过get,post方式体访问http服务器

RT..我之前感觉Android网络通信很神奇,Magic...最近学习了网络知识,现在来总结一下怎么做

好了,就拿例子来说明原理.

说下这个Demo的用处:

1.用户可以访问一个网页

2.用户提交用户名和密码到Http服务器中,在Tomcat的控制台中显示出提交的内容.

先来介绍一下怎么访问网页

看代码

package com.hwb.service;

import java.net.HttpURLConnection;
import java.net.URL;

import com.hwb.utils.StringReader;


public class HtmlContentService
{
    /**
     * 根据路径去获得数据
     * @param path 访问的路径
     * @return 结果
     * @throws Exception
     */
    public static byte[] getContent(String path) throws Exception
    {
        URL url = new URL(path);//构建一个URL对象
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();//得到链接对象
        httpURLConnection.setRequestMethod("POST");//设置请求方法
        httpURLConnection.setReadTimeout(5000);///设置超时时间
        if(httpURLConnection.getResponseCode()==200)//获得响应码
        {
          
            byte[] arr = new byte[1024];
            int res = -1;
            while((res = in.read(arr)) != -1)
            {
                byteArrayOutputStream.write(arr, 0,res);
            }
            byteArrayOutputStream.close();
            in.close();
            return byteArrayOutputStream.toByteArray();
            
        }
        return null ;
    }
}



通过这个简单的方法我们就能进行一次http请求,请求结果可以先读取成二进制数据,然后在进行相应的操作,例如,我们可以获得某个网站的源码之类的..

在应用中,我们可能会从http服务器返回一个xml文件或者是json格式的字符串,我们都可以通过这种方式获得二进制数据,然后进行相应数据的处理

好了,现在介绍下通过get,post提交数据到http服务器

首先我们需要一个http服务器,我拿Tomcat来说明,首先建立一个简单的web application.

看看这个servliet吧..

package com.hwb.control;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 
 *  
 * @ProjectName:  [webProvider] 
 * @Package:      [com.hwb.control]  
 * @ClassName:    [UserServlet]   
 * @Author:       [hwb]   
 * @CreateDate:   [2014-6-7 下午4:15:57]   
 * @UpdateUser:   [hwb]   
 * @UpdateDate:   [2014-6-7 下午4:15:57]   
 * @UpdateRemark: [说明本次修改内容]  
 * @Version:      [v1.0]
 */
public class UserServlet extends HttpServlet
{
	/**
	 *接受2个参数,在控制台打印出来 
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{

		String name = request.getParameter("name");
		String password = request.getParameter("password");
		System.out.println("name =" + name + ",password = "+ password);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		doGet(request,response);
	}
}


好了,我们建立一个Android应用

我建的是4.4的

现在只看关键代码

package com.hwb.service;

import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class UserService
{
	/**
	 *  一个简单扼方法通过get方式提交数据到http服务器上
	 * @param path 访问的url
	 * @param userName 上传的用户名
	 * @param passWord 密码
	 * @return 上传成功与否
	 */
	public static boolean sendDataByGet(String path, String userName,String passWord)
	{
		try
		{
			StringBuilder stringBuilder = new StringBuilder(path);
			//进行编码  
			stringBuilder.append("?name=").append(URLEncoder.encode(userName,"UTF-8")).append("&password=").append(URLEncoder.encode(passWord,"UTF-8"));
			
			URL url = new URL(stringBuilder.toString());
			HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
			httpURLConnection.setRequestMethod("GET");
			httpURLConnection.setConnectTimeout(5000);
			if(httpURLConnection.getResponseCode()==200)
			{
				return true;
			}
		} catch (MalformedURLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 
	 * @param path 路径
	 * @param userName 用户名
	 * @param passWord  密码
	 * @return 结果
	 */
	public static boolean sendDataByPost(String path, String userName,String passWord)
	{
		try
		{
		    URL url = new URL(path);
		    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
		    
		    StringBuilder builder = new StringBuilder();
		    builder.append("name=").append(URLEncoder.encode(userName,"UTF-8")).append("&password=").append(URLEncoder.encode(passWord,"UTF-8"));
		    byte[] arr = builder.toString().getBytes();
		    httpURLConnection.setRequestMethod("POST");
		    httpURLConnection.setConnectTimeout(5000);
		    httpURLConnection.setDoOutput(true);//设置可以写数据
		    httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//设置http post请求的头部信息 请求数据内容类型
			httpURLConnection.setRequestProperty("Content-Length", String.valueOf(arr.length));//设置http post请求的头部信息请求数据的长度
			OutputStream outputStream = httpURLConnection.getOutputStream();
			outputStream.write(arr);//往数据流中写数据
			
		    if(httpURLConnection.getResponseCode()==200)
		    {
		    	return true;
		    }
		    
		} catch (MalformedURLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
}


从中我学到了几个知识点,现在总结一下

1.首先是GET和POST请求的差别.大家都知道GET是在URL路径后面跟上参数,而POST则是放在了请求体内.我用了一个简单的工具拦截了请求,大家可以看看这个比较

Android通过get,post方式体访问http服务器

Android通过get,post方式体访问http服务器

Android通过get,post方式体访问http服务器

那么中文怎么办呢?

请看GET

Android通过get,post方式体访问http服务器

请看post

Android通过get,post方式体访问http服务器


好了,从这几幅图我们知道了一些知识点和解决的办法.首先浏览器会帮我们对数据进行编码.其次,post是不是把数据放在头部的

好了现在解决编码问题,既然我们知道了浏览器会帮我们编码,那么我们为了取得数据就需要进行相应的解码.

我们先普及一下一些知识点,然后在说

我看了这篇文章,做个简单的小结.

对GET方式来说,浏览器最终是以iso8859-1的方式提交到服务器的,假设我的服务器是TOMCAT,它默认的编码方式也是ISO8859-1,如果我们直接通过request.getParameter(); 来获得数据,往往会乱码,其原因就是我们提交的时候可能先用UTF-8或者GBK的方式先进行编码..解决方法就是可以写个编码过滤器,专门为GET请求过滤.拿我的DEMO来说,我的客户端用UTF-8的方式来编码,那么我就可以这么做

new String(value.getBytes("ISO-8859-1"),"UTF-8");
具体代码看下面

现在讲讲post方式,我们可以直接指定编码方式就可以获取正确的数据了

好了,看看所有的代码

package com.hwb.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EncodingFilter implements Filter
{

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException
	{
		// TODO Auto-generated method stub
		HttpServletRequest httpServletRequest = (HttpServletRequest)arg0;
		HttpServletResponse httpServletResponse = (HttpServletResponse)arg1;
		String method = httpServletRequest.getMethod();
		if(method.equals("GET"))
		{
			EncodingWrap encodingWrap = new EncodingWrap(httpServletRequest);
			arg2.doFilter(encodingWrap, httpServletResponse);
		}
		else if(method.equals("POST"))
		{
			httpServletRequest.setCharacterEncoding("UTF-8");//必须设置编码方式
			arg2.doFilter(httpServletRequest, httpServletResponse);
		}
	}
}

package com.hwb.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class EncodingWrap extends HttpServletRequestWrapper
{
	public EncodingWrap(HttpServletRequest request)
	{
		super(request);
	}

	@Override
	public String getParameter(String name)
	{
		// TODO Auto-generated method stub
		
		if(name==null)
			return null;
		else 
		{
			String value = super.getParameter(name);
			try
			{
				return new String(value.getBytes("ISO-8859-1"),"UTF-8");
			} catch (UnsupportedEncodingException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return  null;
	}

}



好了,大致就是这样了,不正确请指出!


--------------------------------------------------------------

如果是上传文件的话,最好用socket做,因为http服务器对请求数据文件大小有限制

Android通过get,post方式体访问http服务器,布布扣,bubuko.com

Android通过get,post方式体访问http服务器

上一篇:Swift 简介 - 苹果最新的编程语言


下一篇:Step by Step Do IOS Swift CoreData Simple Demo