Android之使用HTTP的get,post,HttpClient三种方式向服务器端提交文本数据

来源:互联网 发布:宠物美容剪刀 知乎 编辑:程序博客网 时间:2024/04/27 22:22
1、Get方式
  • 方法:通过拼接url在url后添加相应的数据,如:http://172.22.35.112:8080/videonews/GetInfoServlet?title=霍比特人&timelength=100;
  •  缺点:通过Get方式提交数据只能发送2K以内的数据,适合发送容量较小的数据,另外,如果发送的数据是中文,则需要对url和服务器端做相应的乱码处理(设置能显示中文的编码方式),否则会产生乱码问题。处理方式如下:

2、Post方式

  • 方法:
  1. 使用请求参数组拼成实体数据,即按一定格式把数据组拼起来。如:title= title=霍比特人&timelength=100;
  2. 得到实体数据的字节数据,如:byte []entry=data.deleteCharAt(data.length()-1).toString().getBytes();
  3. 创建一个HttpURLConnection,并且进行相关设置。
  4. 设置HTTP请求的头字段,其中在不使用Cookie的情况下,一些头字段可以省略,不设置,但Content_Type和Content_Length是必须要设置的。如:
  5. 由于实体数据是由客户端流向服务器,可以取得输出流,然后通过输出流向外写数据(注意:只有当取得服务器的响应码时才会向外写数据。由此处可知前面把实体数据转换成byte字节是为了后面进行发送,代码之美完美体现。)。如:
                    

       客户端代码示例:
  
/** * HTTP请求 * @author kesenhoo * */public class HttpRequest {public static boolean sendXML(String path, String xml)throws Exception{byte[] data = xml.getBytes();URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("POST");conn.setConnectTimeout(5 * 1000);//如果通过post提交数据,必须设置允许对外输出数据conn.setDoOutput(true);conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");conn.setRequestProperty("Content-Length", String.valueOf(data.length));OutputStream outStream = conn.getOutputStream();outStream.write(data);outStream.flush();outStream.close();if(conn.getResponseCode()==200){return true;}return false;}/** * 通过get方式提交参数给服务器 * @param path * @param params * @param enc * @return * @throws Exception */public static boolean sendGetRequest(String path, Map<String, String> params, String enc) throws Exception{//构造如下形式的字符串,这里的字符串依情况不同// ?method=save&title=435435435&timelength=89&//使用StringBuilder对象StringBuilder sb = new StringBuilder(path);sb.append('?');//迭代Mapfor(Map.Entry<String, String> entry : params.entrySet()){sb.append(entry.getKey()).append('=').append(URLEncoder.encode(entry.getValue(), enc)).append('&');}sb.deleteCharAt(sb.length()-1);//打开链接URL url = new URL(sb.toString());HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5 * 1000);//如果请求响应码是200,则表示成功if(conn.getResponseCode()==200){return true;}return false;}/** * 通过Post方式提交参数给服务器 * @param path * @param params * @param enc * @return * @throws Exception */public static boolean sendPostRequest(String path, Map<String, String> params, String enc) throws Exception{//需要构造的字符串形式如下:// title=dsfdsf&timelength=23&method=saveStringBuilder sb = new StringBuilder();//如果参数不为空if(params!=null && !params.isEmpty()){for(Map.Entry<String, String> entry : params.entrySet()){//Post方式提交参数的话,不能省略内容类型与长度sb.append(entry.getKey()).append('=').append(URLEncoder.encode(entry.getValue(), enc)).append('&');}sb.deleteCharAt(sb.length()-1);}//得到实体的二进制数据byte[] entitydata = sb.toString().getBytes();URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("POST");conn.setConnectTimeout(5 * 1000);//如果通过post提交数据,必须设置允许对外输出数据conn.setDoOutput(true);//这里只设置内容类型与内容长度的头字段//内容类型Content-Type: application/x-www-form-urlencoded//内容长度Content-Length: 38conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length", String.valueOf(entitydata.length));OutputStream outStream = conn.getOutputStream();//把实体数据写入是输出流outStream.write(entitydata);//内存中的数据刷入outStream.flush();outStream.close();//如果请求响应码是200,则表示成功if(conn.getResponseCode()==200){return true;}return false;}/** * 在遇上HTTPS安全模式或者操作cookie的时候使用HTTPclient会方便很多 * 使用HTTPClient(开源项目)向服务器提交参数 * @param path * @param params * @param enc * @return * @throws Exception */public static boolean sendRequestFromHttpClient(String path, Map<String, String> params, String enc) throws Exception{//需要把参数放到NameValuePairList<NameValuePair> paramPairs = new ArrayList<NameValuePair>();if(params!=null && !params.isEmpty()){for(Map.Entry<String, String> entry : params.entrySet()){paramPairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}}//对请求参数进行编码,得到实体数据UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, enc);//构造一个请求路径HttpPost post = new HttpPost(path); //设置请求实体post.setEntity(entitydata);//浏览器对象DefaultHttpClient client = new DefaultHttpClient(); //执行post请求HttpResponse response = client.execute(post);//从状态行中获取状态码,判断响应码是否符合要求if(response.getStatusLine().getStatusCode()==200){return true;}return false;}}

0 0
原创粉丝点击