在android中,发送http请求的方式一般有两种,HttpURLConnection和HttpClient,下面先从HttpURLConnection说起:
一、HttpURLConnection:
要获取HttpURLConnection的实例,一般只需创建一个URL对象,传入目标网络地址,然后调用一下openConnection()方法即可,如下所示:
URL url = new URL("http://www.baidu.com");
HttpURLConnection connection = url.openConnection();
得到了HttpURLConnection的实例之后,我们需要考虑的就是使用什么样的方式进行http请求。常用的方式主要有两个,GET和POST,GET是希望从服务器获取数据而POST则表示提交数据给服务器,GET的安全性相比于POST要低,但是效率要比POST高,GET方式传送的数据量较小,不能大于2KB,POST传送的数据量较大一般默认为是不受限制的但最好不要大于80k。
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式; 2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
Http请求的写法如下:
connection.setRequestMethod("GET");
接下来就可以自由设置一下链接超时读取超时的毫秒数:
connection.setConnectionTimeOut(8000);
connection.setReadTimeOut(8000);
之后通过getInputStream()方法就可以获得发武器返回的输入流了,然后就可以对输入流进行读取显示。
InputStream input = connection.getInputStream();
最后不要忘了关闭Http链接,使用的方法是disconnection();
connection.disconnection();
HttpURLConnection方式完整代码如下:
package com.example.httpurlconnectiontest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; 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.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.content.Entity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener{ private TextView tv; private Button btn; private HttpURLConnection connection; private static final int SHOW = 1; private Handler handler = new Handler(){ public void handleMessage(Message msg){ switch(msg.what){ case SHOW: String str = (String) msg.obj; tv.setText(str); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(this); } @Override public void onClick(View arg0) { switch(arg0.getId()){ case R.id.btn: getUrlConnection(); break; } } private void getUrlConnection() { //网络任务放在子线程中进行,子线程操作UI要发送消息到handler,由handler更改UI new Thread(new Runnable(){ @Override public void run() { // TODO 自动生成的方法存根 /*try { URL url = new URL("http://www.baidu.com"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET");<span style="font-family: 'Microsoft YaHei', arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap;">//向服务器发送获取数据的请求,POST向服务器发送提交数据的请求,提交的数据必须是键值对,数据和数据之间用&隔开</span>connection.setReadTimeout(8000); connection.setConnectTimeout(8000); InputStream in = connection.getInputStream(); /** * inputstream 字节流 * Reader字符流 * InputStreamReader 转换流,从字节流到字符流的桥梁 * BufferedReader 缓冲流 *//* BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder builder = new StringBuilder(); String line; while((line = reader.readLine())!=null){ builder.append(line); } Message msg = new Message(); msg.what = SHOW; msg.obj = builder.toString(); handler.sendMessage(msg); } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally{ if(connection != null){ connection.disconnect(); } } } }).start(); } }
下面再看HttpClient方式:
HttpClient是Apach提供的Http网络访问的一个接口,也包含在android的API中,可以完成和HttpURLConnection几乎一摸一样的效HttpClient是一个接口,我们无法创建它的实例,通常情况下我们会选择创建DefaultHttpClient的实例:
HttpClient httpClient = new DefaultGttpClient();
实例创建完成下面依然是考虑使用什么样的方式发送Http请求,和HttpURLConnection一样也是有GET、POST两种方式看一下GET方式,创建HttpGet对象,传入目标地址:
HttpGet httpGet = new HttpGet("http://www.baidu.com");
然后发送请求:
httpClient.execute(httpGet);
POST方式要稍微复杂一下,要先创建HttpPost对象然后通过NameValuePair集合来提交参数,并将参数集合传入到一个UrlcodeFormEntity中,然后调用HttpPost的setEntity()方法将构建好的UrlcodeFormEntity传入。
HttpPost httppost = new HttpPost("http://www.baidu.com");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new NameValuePair("name","admin"));
params.add(new NameValuePair("passWord","123456"));f
UrlcodeFromEntity entity = new UrlcodeFromEntity(entity,"utf-8");
httpPost.setEntity(entity);
httpClient.excute(httpPost);
发送完请求通常情况下我们会获取服务返回的状态码,如果状态码是200,则表示响应都成功了。
if(httpResponse.getStatusLine().getStatusCode()==200){
//解析数据
}
可以通过getEntity()方法来获取返回的HttpEntity实例然后再用EntityUtils.toString()就可以将获取到的HttpEntity转换成字符串了。
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity,"utf-8");下面请看代码:package com.example.httpurlconnectiontest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; 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.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.content.Entity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener{ private TextView tv; private Button btn; private HttpURLConnection connection; private static final int SHOW = 1; private Handler handler = new Handler(){ public void handleMessage(Message msg){ switch(msg.what){ case SHOW: String str = (String) msg.obj; tv.setText(str); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(this); } @Override public void onClick(View arg0) { switch(arg0.getId()){ case R.id.btn: getUrlConnection(); break; } } private void getUrlConnection() { //网络任务放在子线程中进行,子线程操作UI要发送消息到handler,由handler更改UI new Thread(new Runnable(){ @Override public void run() { HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://www.baidu.com"); try { HttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); String str = EntityUtils.toString(entity, "utf-8"); Message msg = Message.obtain(); msg.what = SHOW; msg.obj = str; handler.sendMessage(msg); } catch (ClientProtocolException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }).start(); } }
本文深入探讨了在Android中使用HttpURLConnection和HttpClient进行HTTP请求的方法,包括GET和POST请求的使用场景、安全性比较、超时设置、输入流读取及异常处理。同时介绍了HttpClient的使用方式,包括创建HttpClient实例、发送GET和POST请求、获取响应状态码、解析响应内容等关键步骤。
891

被折叠的 条评论
为什么被折叠?



