很郁闷的是遇到,不能获取JSON数据的问题,而服务端已提供数据。
1. 服务端代码实现数据访问
用以提供客户端所需数据,服务端是Spring mvc模式,返回JSON数据,代码如下:
package com.scengine.wtms.business.controller;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/androidservice")
public class AndroidRemoteController
{
@RequestMapping(value = "/test/videos",method=RequestMethod.GET)
@ResponseBody
public List<Video> saveAccount()
{
List<Video> videos = new ArrayList<Video>();
for (int i = 1; i < 21; i++)
{
Video video = new Video();
video.setId(i);
video.setName("boonya" + i * 100);
video.setTime(i % 2 == 0 ? 90 : 120);
videos.add(video);
}
return videos;
}
class Video implements Serializable{
private static final long serialVersionUID = -5230449456309384978L;
private Integer id;
private String name;
private Integer time;
public Video()
{
}
public Video(Integer id, String name, Integer time)
{
super();
this.id = id;
this.name = name;
this.time = time;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getTime()
{
return time;
}
public void setTime(Integer time)
{
this.time = time;
}
}
}
Tomcat服务器运行数据,浏览器显示结果如下:
2.Android客户端JSON获取
服务器端数据访问是Get方式,之前由于是网上copy的代码所以就没有管,用的是HttpPost对象,但是后来怎么都出不来JSON数据,于是乎发现两边的提交方式不一致后来就改用了HttpGet,但是仍然获取不到JSON数据。
Activity代码如下:
package com.boonya.httpclienttest;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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 org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity extends Activity
{
private static final String TAG = "MainActivity";
private List<HashMap<String, Object>> videos = null;
private HashMap<String, Object> video = null;
private ListView listView = null;
private static String url = "http://192.168.1.147:8090/wtms/androidservice/test/videos";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) findViewById(R.id.videos);
getPDAServerData(url);
}
private void getPDAServerData(String url)
{
HttpClient client = new DefaultHttpClient();
// 提拱默认的HttpClient实现
HttpGet request;
try
{
request = new HttpGet(new URI(url));
HttpResponse response = client.execute(request);
// 判断请求是否成功
if (response.getStatusLine().getStatusCode() == 200)
{ // 200表示请求成功
HttpEntity entity = response.getEntity();
if (entity != null)
{
String out = EntityUtils.toString(entity, "UTF-8");
Log.i(TAG, out);
JSONArray jsonArray = new JSONArray(out);
videos = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
int id = jsonObject.getInt("id");
String name = jsonObject.getString("title");
int timelength = jsonObject.getInt("time");
video = new HashMap<String, Object>();
video.put("id", id);
video.put("name", name);
video.put("timelength", "时长为:" + timelength);
videos.add(video);
}
SimpleAdapter adapter = new SimpleAdapter(this, videos, R.layout.item, new String[]
{ "name", "timelength" }, new int[]
{ R.id.title, R.id.timelength });
listView.setAdapter(adapter);
}
}
} catch (Exception e)
{
e.printStackTrace();
Log.e(TAG, e.toString());
Toast.makeText(MainActivity.this, "获取数据失败", Toast.LENGTH_LONG).show();
}
}
}
很遗憾,out内容是“<javascript ........> </javascript>”;由于没有获取到JSON数据就没法解析JSON。
3.寻找分析解决问题
由于web应用是设置了权限的,用户只能登录后才能访问资源,所以用户无法获取到正确的url地址提供的数据,访问的url会自动转发到login页面,所以返回的是网页的html内容。所以会出现Javascript的标签字符串。
web server当用户登录后HttpPost与HttpGet才能正常发起HTTP访问。如果web端存在一个session,而Android客户端并没有cookie存在,所以没有权限对链接进行访问,这就是问题症结所在。
解决方案在这里:http://blog.csdn.net/boonya/article/details/39521691