为了方便大家学习,工程代码以打包上传,http://download.csdn.net/detail/devintt/8029549
HTTP通信分两种形式:GET,POST
GET:
优点:只需要在URL设置参数就可以进行对服务器的访问,比较方便。
缺点:但是传输的参数不得大于2kb,而且参数公开可查看。
POST:
优点:传输参数可大于2kb,参数不可查看,相对安全。
缺点:需要用List<NameValuePair>进行打包。
使用的是安卓sdk自带的org.apache.http包
注意:
安卓2.3版本开始,通信线程需要和UI线程分开,不然会造成线程阻塞,所以把HTTP通信的代码写在一个Thread类里面。
void run() {
HttpRunner jsonParser = new HttpRunner();
String json = jsonParser.makeHttpPOST(httpUrl, params);
Message msg = new Message();
switch (type) {
case POST:
msg.what = POST;
break;
default:
break;
}
msg.obj = json;
handler.sendMessage(msg);
}
在HTTP通信的时候会造成UI线程的停滞,为了避免这种情况而造成横的UI线程崩溃,所以我们将HTTP线程交给后台运行,并且需要用一个Handler将通信得到的消息打包发送到Activity里面。Activity里面也需要Handler将消息接收。
示例代码:
/************************** msg接收 *************************/
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case HttpThreadPost.POST:
result = (String) msg.obj;
pDialog.dismiss();
result = myJsonFormatTool.formatJson(result, " ");
debugDialog(result);
break;
case HttpThreadGet.GET:
result = (String) msg.obj;
pDialog.dismiss();
result = myJsonFormatTool.formatJson(result, " ");
debugDialog(result);
break;
case HttpThreadGet.GETIMG:
result = (String) msg.obj;
pDialog.dismiss();
debugDialog(result);
break;
default:
break;
}
}
};
主要的实现HTTP通信代码:
实现HTTP通信我们新建一个类,里面有两个方法,post和get。将URL和params传递进去,进行通信。实现代码和java基本一致。
示例代码:
// post数据
public String makeHttpPOST(String url, List<NameValuePair> params) {
// Making HTTP request
jsonString = "";
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
// 请求超时,60秒
httpClient.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, 3 * 60 * 1000);
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
if (httpResponse.getStatusLine().getStatusCode() != 200) {
jsonString = "ERROR: Status Code "
+ httpResponse.getStatusLine().getStatusCode();
return jsonString;
}
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
} catch (ClientProtocolException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
} catch (IOException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
}
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
is.close();
jsonString = sb.toString();
Log.d("json数据", jsonString);
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
jsonString = "ERROR:" + e.toString();
}
// return JSON String
return jsonString;
}
// get数据
public String makeHttpGET(String url) {
jsonString = "";
// Making HTTP request
Log.d("http请求", url);
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
// 请求超时,2*60 * 1000秒
httpClient.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, 60 * 1000);
HttpGet httpRequest = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpRequest);
HttpEntity httpEntity = httpResponse.getEntity();
if (httpResponse.getStatusLine().getStatusCode() != 200) {
jsonString = "ERROR: Status Code "
+ httpResponse.getStatusLine().getStatusCode();
return jsonString;
}
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
} catch (ClientProtocolException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
} catch (IOException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
}
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
is.close();
jsonString = sb.toString();
Log.d("json数据", jsonString);
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
jsonString = "ERROR:" + e.toString();
}
// return JSON String
return jsonString;
}
// get图片
public byte[] makeImgHttpGET(String url) {
jsonString = "";
// Making HTTP request
Log.d("http请求", url);
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
// 请求超时,2*60 * 1000秒
httpClient.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, 60 * 1000);
HttpGet httpRequest = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpRequest);
HttpEntity httpEntity = httpResponse.getEntity();
if (httpResponse.getStatusLine().getStatusCode() != 200) {
jsonString = "Status Code:"
+ httpResponse.getStatusLine().getStatusCode();
return null;
}
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
} catch (ClientProtocolException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
} catch (IOException e) {
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
}
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
try {
while ((len = is.read(buffer)) != -1) {
outstream.write(buffer, 0, len);
}
outstream.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
jsonString = "ERROR:" + e.toString();
}
// return JSON String
return outstream.toByteArray();
}
最后在AndroidManifest.xml加上权限
<uses-permission android:name="android.permission.INTERNET"/>
一个android HTTP接口测试小软件,可以GET和POST,参数可以动态添加删除,结果自动格式化json,里面也有GET图片的代码,但功能还没加上去。
为了方便大家学习,工程代码以打包上传,http://download.csdn.net/detail/devintt/8029549
本人是初学者,第一次发一下自己做过的记录,有问题请大大们指教一下,谢谢!~