Android开发--Http操作介绍(二)

通常与服务器建立连接有两种方法,Get和Post方法,下面就对这两个方法进行介绍。


无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源。

1.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。

2.使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

3.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

如果使用HttpPost方法提交HTTP POST请求,还需要使用HttpPost类的setEntity方法设置请求参数。


下面以一个实例介绍这两个方法的具体实现:

本程序介绍如何通过HttpClient模块来创建Http连接,并分别以Http Get和Post方法传递参数,连接之后取回web server的返回网页结果。

     注意,在用Post时,传递变量必须用NameValuePais[]数组存储,通过HttpRequest.setEntity()方法来发出http请求。

     此外,也必须通过DefaultHttpClient().execute(httpRequest)添加HttpRequest对象来接收web server的回复,在通过httpResponse.getEntity()取出回复信息。

下图是实现的截图:


具体的实现代码如下:

//使用Get和Post方法向服务器发送请求,其中包含数据
public class MainActivity extends Activity {
	private Button button;
	private Button button2;
	private EditText editText;
	private TextView textView;
	private String baseUrl="http://www.baidu.com";
	private HttpResponse httpResponse;
	private HttpEntity httpEntity;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button=(Button)findViewById(R.id.button1);
		button2=(Button)findViewById(R.id.button2);
		editText=(EditText)findViewById(R.id.edittext);
		textView=(TextView)findViewById(R.id.textview);
		
		button.setOnClickListener(new OnClickListener() {
			//这里用的是Get方法,注意传递参数使用的方法
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				String userEdit=editText.getText().toString();
				//如果这里用到的参数不止一个,那个每一个参数都需要用&符号连接
				String URL=baseUrl+"?"+userEdit;
				//生成一个请求对象
				HttpGet httpGet=new HttpGet(URL);
				//生成一个Http客户端对象
				HttpClient httpClient=new DefaultHttpClient();
				//使用Http客户端发送请求对象
				InputStream inputStream=null;
				try {
					httpResponse=httpClient.execute(httpGet);
					//收到服务器的响应之后把返回的数据读取出来
					httpEntity=httpResponse.getEntity();
					inputStream=httpEntity.getContent();
					//流文件的读取
					BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
					String resultString="";
					String lineString="";
					while((lineString=reader.readLine())!=null){
						resultString=resultString+lineString;
					}
					textView.setText(resultString);
				} catch (ClientProtocolException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				finally{
					try {
						inputStream.close();
					} catch (Exception e2) {
						// TODO: handle exception
						e2.printStackTrace();
					}
				}
			}
		});
		//这里用到的是Post方法连接服务器,注意传递参数的方法
		button2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				String userEdit=editText.getText().toString();
				//如果传递的参数不止一个,那么就需要用到多个NameValuePair对象
				NameValuePair nameValuePair=new BasicNameValuePair("userEdit", userEdit);
				List<NameValuePair> nameValuePairs=new ArrayList<NameValuePair>();
				nameValuePairs.add(nameValuePair);
				try {
					HttpEntity requestEntity=new UrlEncodedFormEntity(nameValuePairs);
					HttpPost httpPost=new HttpPost(baseUrl);
					httpPost.setEntity(requestEntity);
					HttpClient httpClient =new DefaultHttpClient();
					
					InputStream inputStream=null;
					try {
						httpResponse=httpClient.execute(httpPost);
						
						//另一种获取服务器响应的方法
//						/*若状态码为200 ok*/  
//				          if(httpResponse.getStatusLine().getStatusCode() == 200)    
//				          {   
//				            /*取出响应字符串*/  
//				            String strResult = EntityUtils.toString(httpResponse.getEntity());   
//				            textView.setText(strResult);   
//				          }   
//				          else   
//				          {   
//				            textView.setText("Error Response: "+httpResponse.getStatusLine().toString());   
//				          } 
//						
						//收到服务器的响应之后把返回的数据读取出来
						httpEntity=httpResponse.getEntity();
						inputStream=httpEntity.getContent();
						//流文件的读取
						BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
						String resultString="";
						String lineString="";
						while((lineString=reader.readLine())!=null){
							resultString=resultString+lineString;
						}
						textView.setText(resultString);
					} catch (ClientProtocolException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					finally{
						try {
							inputStream.close();
						} catch (Exception e2) {
							// TODO: handle exception
							e2.printStackTrace();
						}
					}
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		});
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

最后,需要在AndroidManifest.xml文件中声明访问网络的权限:

 <uses-permission android:name="android.permission.INTERNET"/>

其中,布局文件的代码如下:

<ScrollView
android:id="@+id/myScrollView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<LinearLayout 

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:orientation="vertical"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请输入传递给服务器端的参数:" 
        android:textColor="#0000ff"
        />
    
    <EditText 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edittext"
        />

    <Button 
        android:id="@+id/button1"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:text="Get方法发送请求"
        />
        <Button 
        android:id="@+id/button2"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:text="Post方法发送请求"
        />
        <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#ff0000"
   />

</LinearLayout>
</ScrollView>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值