HttpClient获取服务器JSON数据问题处理

原创
2014/09/22 15:46
阅读数 3.8K

很郁闷的是遇到,不能获取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


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部