Android中提供的HttpURLConnection(JDK自带)和HttpClient(Apache提供)接口可以用来开发HTTP程序。
服务器端有如下json数据
- [
- {
- "image": "http://222.22.254.223:8080/web/a.jpg",
- "title": "新闻标题1",
- "content": "新闻内容1",
- "conut": "跟帖人数1"
- },
- {
- "image": "http://222.22.254.223:8080/web/b.jpg",
- "title": "新闻标题2",
- "content": "新闻内容2",
- "conut": "跟帖人数2"
- },
- {
- "image": "http://222.22.254.223:8080/web/c.jpg",
- "title": "新闻标题3",
- "content": "新闻内容3",
- "conut": "跟帖人数3"
- },
- {
- "image": "http://222.22.254.223:8080/web/d.jpg",
- "title": "新闻标题4",
- "content": "新闻内容4",
- "conut": "跟帖人数4"
- },
- {
- "image": "http://222.22.254.223:8080/web/e.jpg",
- "title": "新闻标题5",
- "content": "新闻内容5",
- "conut": "跟帖人数5"
- }
- ]
1.首先来看HttpURLConnection的Get方法获取json数据:
- public List<HeadNews> HttpURLConnection_GET()throws Exception{
- List<HeadNews>list=new ArrayList<HeadNews>();
- String path="http://222.22.254.223:8080/web/HeadNewsJson";
- //参数直接加载url后面
- path+="?username="+URLEncoder.encode("我是大帅哥HttpClientGET","utf-8");
- URL url=new URL(path);
- HttpURLConnection conn=(HttpURLConnection) url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5000);
- if(conn.getResponseCode()==200){ //200表示请求成功
- InputStream is=conn.getInputStream(); //以输入流的形式返回
- //将输入流转换成字符串
- ByteArrayOutputStream baos=new ByteArrayOutputStream();
- byte [] buffer=new byte[1024];
- int len=0;
- while((len=is.read(buffer))!=-1){
- baos.write(buffer, 0, len);
- }
- String jsonString=baos.toString();
- baos.close();
- is.close();
- //转换成json数据处理
- JSONArray jsonArray=new JSONArray(jsonString);
- for(int i=0;i<jsonArray.length();i++){ //一个循环代表一个headnews对象
- HeadNews headnews=new HeadNews();
- JSONObject jsonObject = jsonArray.getJSONObject(i);
- headnews.setTitle(jsonObject.getString("title"));
- headnews.setContent(jsonObject.getString("content"));
- headnews.setConut(jsonObject.getString("conut"));
- headnews.setImage(jsonObject.getString("image"));
- list.add(headnews);
- }
- }
- return list;
- }
2.HttpURLConnection的POST方法获取json数据:
- public List<HeadNews>HttpURLConnection_POST() throws Exception{
- List<HeadNews>list=new ArrayList<HeadNews>();
- String path="http://222.22.254.223:8080/web/HeadNewsJson";
- URL url=new URL(path);
- HttpURLConnection conn=(HttpURLConnection) url.openConnection();
- conn.setDoOutput(true); //允许向服务器输出数据
- conn.setDoInput(true); //允许接收服务器数据
- conn.setRequestMethod("POST");
- conn.setUseCaches(false); // Post 请求不能使用缓存
- conn.setConnectTimeout(5000);
- // 参数前面不能加?号
- String urlParas="username="+URLEncoder.encode("admin", "UTF-8");
- byte [] entity=urlParas.getBytes();
- //设置请求参数
- conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); //实体参数类型
- conn.setRequestProperty("Content-Length", entity.length+""); //实体参数长度
- // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
- // 要注意的是connection.getOutputStream会隐含的进行connect。
- conn.connect();
- //将要上传的参数写入流中
- conn.getOutputStream().write(entity);
- if(conn.getResponseCode()==200){
- InputStream is=conn.getInputStream();
- //将输入流转换成字符串
- ByteArrayOutputStream baos=new ByteArrayOutputStream();
- byte [] buffer=new byte[1024];
- int len=0;
- while((len=is.read(buffer))!=-1){
- baos.write(buffer, 0, len);
- }
- String json=baos.toString();
- baos.close();
- is.close();
- //json处理
- JSONArray jsonArray=new JSONArray(json);
- for(int i=0;i<jsonArray.length();i++){
- HeadNews headnews=new HeadNews();
- JSONObject jsonObject = jsonArray.getJSONObject(i);
- headnews.setTitle(jsonObject.getString("title"));
- headnews.setContent(jsonObject.getString("content"));
- headnews.setConut(jsonObject.getString("conut"));
- headnews.setImage(jsonObject.getString("image"));
- list.add(headnews);
- }
- }
- return list;
- }
- public List<HeadNews>HttpClient_GET() throws Exception{
- List<HeadNews>list=new LinkedList<HeadNews>();
- String path="http://222.22.254.223:8080/web/HeadNewsJson";
- //get方法设置参数要?号
- StringBuilder sb=new StringBuilder(path);
- sb.append("?");
- sb.append("username=").append(URLEncoder.encode("我是大帅哥HttpClientGET","utf-8"));
- //1.得到浏览器
- HttpClient httpClient=new DefaultHttpClient();//浏览器
- //2指定请求方式
- HttpGet httpGet=new HttpGet(sb.toString());
- //3.执行请求
- HttpResponse httpResponse=httpClient.execute(httpGet);
- //4 判断请求是否成功
- int status=httpResponse.getStatusLine().getStatusCode();
- if(status==200){
- //读取响应内容
- String result=EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
- //json处理
- JSONArray jsonArray=new JSONArray(result);
- for(int i=0;i<jsonArray.length();i++){
- HeadNews headnews=new HeadNews();
- JSONObject jsonObject = jsonArray.getJSONObject(i);
- headnews.setTitle(jsonObject.getString("title"));
- headnews.setContent(jsonObject.getString("content"));
- headnews.setConut(jsonObject.getString("conut"));
- headnews.setImage(jsonObject.getString("image"));
- list.add(headnews);
- }
- }
- return list;
- }
4.使用HttpClient的post方法获取Json:
- public List<HeadNews>HttpClient_POST() throws Exception{
- List<HeadNews>list=new ArrayList<HeadNews>();
- String path="http://222.22.254.223:8080/web/HeadNewsJson";
- //1.得到浏览器
- HttpClient httpClient=new DefaultHttpClient();
- //2指定请求方式
- HttpPost httpPost=new HttpPost(path);
- //3.构建请求实体的数据
- List<NameValuePair> paras=new ArrayList<NameValuePair>();
- paras.add(new BasicNameValuePair("username", "我是帅哥httpclientPost"));
- //4.构建实体
- UrlEncodedFormEntity entity=new UrlEncodedFormEntity(paras,"utf-8");
- //5。。把实体放入请求对象
- httpPost.setEntity(entity);
- //6.执行请求
- HttpResponse httpResponse=httpClient.execute(httpPost);
- int status=httpResponse.getStatusLine().getStatusCode();
- if(status==200){
- //读取响应内容
- String result=EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
- //
- JSONArray jsonArray=new JSONArray(result);
- for(int i=0;i<jsonArray.length();i++){
- HeadNews headnews=new HeadNews();
- JSONObject jsonObject = jsonArray.getJSONObject(i);
- headnews.setTitle(jsonObject.getString("title"));
- headnews.setContent(jsonObject.getString("content"));
- headnews.setConut(jsonObject.getString("conut"));
- headnews.setImage(jsonObject.getString("image"));
- list.add(headnews);
- }
- }
- return list;
- }
另外提一点:
Get方式提交不论是HttpURLConnection还是HttpClient,传递中文参数会产生乱码,(传递方法看上面代码)
虽然已经用URLEncoder.encode("中文参数","utf-8")转成utf-8格式,在servlet端也使用spring过滤中文乱码,
但是仍然要这样子接收,不然会中文乱码(不知为何):
- new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")
Post方式接收中文参数则没有这个问题,直接:
- request.getParameter("username")