Android用Apache HttpClient 实现POST和Get请求

快速记忆(POST)

1.       要想连接网络,肯定需要一个客户端对象,所以首先创建一个客户端对象HttpClient

2.       拥有客户端对象之后肯定需要对互联网进行访问,首先要对互联网进行请求,所以要创建一个请求对象HttpUriRequest,因为是Post请求,所以使用HttpPost

3.       我们知道请求对象包含请求行(方法、路径、协议),消息头,请求实体三部分。通过new HttpPost(uri)可以设置请求行的路径,现在需要设置请求实体中的请求参数。

我们知道请求参数一定是由请求参数的名称和请求参数的值组成。这时就需要一个类NameValuePair,这是一个键值对,在初始化的时候为了简便直接使用其子类BaseNameValuePair(String name , String value)。

如果有多组请求参数就要使用List集合List<NameValuePair>

4.       已经有一个存放参数的键值对的集合只有,就可以创建一个请求实体对象,并且将参数集合传进去—new UrlDecodedFormEntity(List<NameValuePair>)

5.       然后设置请求对象的请求实体

request.setEntity(new UrlDecodedFormEntity(List<NameValuePair>))

6.       现在不管是要访问的网络地址还是参数就都已经放入请求对象中了,现在就可以利用客户端进行请求—将请求对象发送出去,并且获得响应对象

响应对象  =  客户端对象.execute(请求对象)

7.       我们都知道响应对象也是由状态行(协议,状态码,状态描述),消息头,响应实体三部分组成。现在有了响应对象就可以获取响应对象中的消息。

具体方法见上。

1.  GET实现    (提交网址为:url?参数  的形式,提交的参数值显式地显示在提交的网址中,参数大小是有限制的,安全性也不高)


package com.yarin.android.Examples_08_02;

import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;

public class Activity2 extends Activity

{ @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.http);  TextView mTextView = (TextView) this.findViewById(R.id.TextView_HTTP);  // http地址  String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";  // HttpGet连接对象  HttpGet httpRequest = new HttpGet(httpUrl);  try

{   // 取得HttpClient对象   HttpClient httpclient = new DefaultHttpClient();   // 请求HttpClient,取得HttpResponse   HttpResponse httpResponse = httpclient.execute(httpRequest);   // 请求成功   if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)

{     // 取得返回的字符串     String strResult = EntityUtils.toString(httpResponse.getEntity());     mTextView.setText(strResult);   }

else

{     mTextView.setText("请求错误!");   }  }

catch (ClientProtocolException e)

{   mTextView.setText(e.getMessage().toString());  }

catch (IOException e)

{    mTextView.setText(e.getMessage().toString());  }

catch (Exception e)

{    mTextView.setText(e.getMessage().toString());  }

// 设置按键事件监听  Button button_Back = (Button) findViewById(R.id.Button_Back);  /* 监听button的事件信息 */  button_Back.setOnClickListener(new Button.OnClickListener() {   public void onClick(View v) {    /* 新建一个Intent对象 */    Intent intent = new Intent();    /* 指定intent要启动的类 */    intent.setClass(Activity02.this, Activity01.class);    /* 启动一个新的Activity */    startActivity(intent);    /* 关闭当前的Activity */    Activity2.this.finish();   }  }); }}
2.  POST(参数在请求头中,大小也没有限制,相对于GET请求更安全)

package com.yarin.android.Examples_08_02;

import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;

public class Activity03 extends Activity

{ @Override public void onCreate(Bundle savedInstanceState)

{  super.onCreate(savedInstanceState);  setContentView(R.layout.http);  TextView mTextView = (TextView) this.findViewById(R.id.TextView_HTTP);  // http地址  String httpUrl = "http://192.168.1.110:8080/httpget.jsp"; /*    * NameValuePair代表一个HEADER,List<NameValuePair>存储全部的头字段    * UrlEncodedFormEntity类似于URLEncoder语句进行URL编码    * HttpPost类似于HTTP的POST请求    * client.execute()类似于发出请求,并返回Response */

// HttpPost连接对象  HttpPost httpRequest = new HttpPost(httpUrl);  // 使用NameValuePair来保存要传递的Post参数  List<NameValuePair> params = new ArrayList<NameValuePair>();  // 添加要传递的参数

NameValuePair pair1 = new BasicNameValuePair("par", "HttpClient_android_Post"));

params.add(pair1);  //params.add(new BasicNameValuePair("par", "HttpClient_android_Post"));  try

{   // 设置字符集   HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");   // 请求httpRequest   httpRequest.setEntity(httpentity);   // 取得默认的HttpClient   HttpClient httpclient = new DefaultHttpClient();   // 取得HttpResponse   HttpResponse httpResponse = httpclient.execute(httpRequest);   // HttpStatus.SC_OK表示连接成功    if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)

{     // 取得返回的字符串     String strResult = EntityUtils.toString(httpResponse.getEntity());     mTextView.setText(strResult);    }

else

{     mTextView.setText("请求错误!");    }  }

catch (ClientProtocolException e)

{    mTextView.setText(e.getMessage().toString());  }

catch (IOException e)

{    mTextView.setText(e.getMessage().toString());  }

catch (Exception e)

{    mTextView.setText(e.getMessage().toString()); }  // 设置按键事件监听  Button button_Back = (Button) findViewById(R.id.Button_Back);  /* 监听button的事件信息 */  button_Back.setOnClickListener(new Button.OnClickListener()

{   public void onClick(View v)

{    /* 新建一个Intent对象 */    Intent intent = new Intent();    /* 指定intent要启动的类 */    intent.setClass(Activity03.this, Activity01.class);    /* 启动一个新的Activity */    startActivity(intent);    /* 关闭当前的Activity */    Activity03.this.finish();   }  }); }}

二、HttpURLConnection 方式 1 URL url = null; 2 HttpURLConnection conn = null; 3 InputStream in = null; 4 OutputStream out = null; 5 byte[] data ="测试字符串".getBytes(); 6 try{ 7    url =new URL("www.xxx.com/servlet"); 8    conn = (HttpURLConnection) url.openConnection(); 9 10    //设置连接属性11    conn.setDoOutput(true);// 使用 URL 连接进行输出12    conn.setDoInput(true);// 使用 URL 连接进行输入13    conn.setUseCaches(false);// 忽略缓存14    conn.setConnectTimeout(30000);//设置连接超时时长,单位毫秒15    conn.setRequestMethod("POST");//设置请求方式,POST or GET,注意:如果请求地址为一个servlet地址的话必须设置成POST方式16 17 //设置请求头18   conn.setRequestProperty("Accept", "*/*");19   conn.setRequestProperty("Connection", "Keep-Alive");20   conn.setRequestProperty("Accept-Charset", "utf-8");21   if (data != null) {22      out = conn.getOutputStream();23      out.write(data);24   }25   int code = conn.getResponseCode();26   if(code ==200){27      in = conn.getInputStream();// 可能造成阻塞28      long len = conn.getContentLength();29      byte[] bs = new byte[(int) len];//返回结果字节数组30      int all = 0;31   int dn = 0;32      while ((dn = in.read(bs, all, 1)) > 0) {33        all += dn;34        if (all == len) {35        break;36        }37      }38   }39 }
时间: 2024-10-06 23:24:56

Android用Apache HttpClient 实现POST和Get请求的相关文章

android使用apache httpclient发送post请求

package com.liuc; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.ht

Android 网络应用--Apache HttpClient的使用

使用HttpClient发送请求,接收响应很简单,只要5步: 创建HttpClient 对象 创建HttpGet对象:或者是HttpPost 对象 如果需要发送请求参数,可以调用HttpGet HttpPost共同的setParams(HttpParams params) 方法来添加请求参数:对于HttpPost对象,也可以调用setEntity(HttpEntity entity)方法来设置请求参数 客户端条件参数: List<NameValuePair> params = new     

Android 6.0 使用 Apache HttpClient

Android 6.0版本已经已经基本将Apahce Http Client 移除出SDK. 那么问题来了,如果我在以前的项目中使用了Apache HttpClient相关类,怎么办呢? 请看官网给出的答案 Apache HTTP Client Removal Android 6.0 release removes support for the Apache HTTP client. If your app is using this client and targets Android 2.

Apache HttpClient : Http Cookies

前言 HttpClient已经被集成到Android的SDK里,但在JDK里面仍然需要HttpURLConnectionn发起HTTP请求.HttpClient可以看做是一个加强版的HttpURLConnection,但它的侧重点是如何发送请求.接受相应和管理Http连接. 在介绍Http Cookies之前,笔者给出一个应用场景:你需要一个根据地理信息(城市名或者经纬度)获取天气的应用.可选的API很多,不幸的是,网上提到的Google天气API已经停止服务了(不是被墙):雅虎是英文的,且需要

Android网络(3):HttpClient作客户端,Tomcat Servlet作服务器的交互示例

前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后台服务器用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文下面的服务器方面操作在普通版的Eclipse也是可以的.我这里为了和ADT-bundle分开,特意重新安个JavaEE版的Eclipse.] 1.下载Eclipse的Tomcat插件:http://www

一起学android之Apache接口(17)

Apache HttpClient是一个开源项目,为客户端的HTTP编程提供高效.最新.功能丰富的工具包支持. 在Apache HttpClient库中,我们常用的对网络连接有用的包主要有以下几类: -org.apache.http.HttpResponse -org.apache.http.client.HttpClient -org.apache.http.client.methods.HttpGet -org.apache.http.impl.client.DefaulfHttpClien

Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

上文简单介绍了HttpClient和Tomcat服务器的交互,主角是HttpClient,然后它跟服务器交互有两种方式即get和post.所以这个HttpClient就类似于电脑上用的浏览器.当我打开多个网页的时候,并不需要开一个网页就开一个浏览器,而是一个浏览器上面开了好几个网页.对应于HttpClient,即无需连接一次就new一个HttpClient.一般,我们希望一个应用里就一个HttpClient就ok了,就像我们的手机或PC,没人会呼呼的装好几个浏览器.本文即解决此问题,代码可以直接

Android客户端使用HttpClient发起web数据访问

HttpClient与服务器数据交互方式:HttpPost和HttpGet 分别对应Post和Get提交.因为要做Android客户端的缘故,所以就必须实现客户端与服务器实现数据交互,以保证数据链条的通畅,实现数据闭环.由于之前对Android客户端访问web数据没有设置权限,所以可以很好的访问系统资源,但是如果是开发应用这种方式就存在极大的安全隐患,一个Host或Get提交过去数据就获取到了,web端系统完全就是裸奔.所以web端权限管理很有必要,也就不用过于担心Android客户端带来的安全

Android开发实现HttpClient工具类

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.你可以把HttpClient想象成一个浏览器,通过它的API我们可以很方便的发出GET,POST请求(当然它的功能远不止这些). 比如你只需以下几行代码就能发出一个简单的GET请求并打印响应结果: try {         // 创建一个默认的HttpClient         HttpClient httpclient =