在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();
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();
}
}