文档章节

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

boonya
 boonya
发布于 2014/09/22 15:46
字数 834
阅读 1322
收藏 0

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


© 著作权归作者所有

boonya
粉丝 76
博文 299
码字总数 51161
作品 0
海淀
高级程序员
私信 提问
Apache HttpClient 资源释放、请求超时,导致线程池用光、内存不足

Apache HttpClient,据说很强大,可以支持峰值一秒7万以上的请求。不过需要注意一些资源释放和超时处理的问题。 问题1:线程资源无法释放,最终导致内存不足、或线程池被用光。 问题代码: ...

onedotdot
2018/10/17
293
0
apache.commons.httpclient.HttpClient get/post请求

一、httpclient 发送请求的步骤(流程) 1、创建httpclient 对象 2、创建某种连接方式的对象 --如 GetMethod PostMethod 等对象,构造函数中是请求地址即url,如果是get请求可以在url后面添加...

QH_C
2015/04/13
163
0
Android下的网络编程 & 代理的使用

1. 使用 标准Java接口: 设计的类: java.net.* 基本步骤: 1) 创建 URL 以及 URLConnection / HttpURLConnection 对象 2) 设置连接参数 3) 连接到服务器 4) 向服务器写数据 5)从服务器读取数据...

小编辑
2010/08/12
5.5K
2
.NET Core 2.1中的HttpClientFactory最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。 介绍 在.NETCore平台的2.1新增了...

dotNET跨平台
2018/08/16
0
0
.NetCore 2.1中的HttpClientFactory最佳实践

.NET Core 2.1中的HttpClientFactory最佳实践 ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一...

Chaunce
2018/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
7
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部