Androidannotation使用之@Rest与server交互的JSON数据转换(二)

开篇

之前的一篇博客:Androidannotation使用之@Rest获取资源及用户登录验证(一):http://blog.csdn.net/nupt123456789/article/details/24384713 主要写了Rest在用户登录的时候,须要JSESSION字段的问题。本博客主要写JSON格式的转换。

@Rest的參考文档:

https://github.com/excilys/androidannotations/wiki/Rest-API#rest

简单介绍:

从上一篇博客中,我们能够看出,我们直接再浏览器中请求http://192.168.0.101:8080/cbvr/getUserInfoList.action 的时候,返回的字符串事实上是JSON格式。我们上一篇博客,就是把它直接当String进行处理了,没有出现什么问题。当然,我们接下来,能够使用GSON对String进行解析,这没有什么问题。然而,我们通常想,我们换一个转换器不即可了吗?代码例如以下:

/*
 * $filename: UserService.java,v $
 * $Date: 2014-4-20  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package com.example.testaa;

import org.androidannotations.annotations.rest.Accept;
import org.androidannotations.annotations.rest.Post;
import org.androidannotations.annotations.rest.Rest;
import org.androidannotations.api.rest.MediaType;
import org.androidannotations.api.rest.RestClientErrorHandling;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.GsonHttpMessageConverter;

/*
 *@author: ZhengHaibo
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2014-4-20  Nanjing,njupt,China
 */
@Rest(rootUrl = "http://192.168.0.101:8080/cbvr", converters = {GsonHttpMessageConverter.class})
public interface UserService extends RestClientErrorHandling{
	@Post("/getUserInfoList.action")
	@Accept(MediaType.APPLICATION_JSON)
	ResponseEntity<DataGrid> getUserInfoList();
}

这样,我们就使用了Gson的消息转换器,当然,须要导入GSON相关的包。可是执行程序的时候,发现报错例如以下:

05-02 16:58:32.644: W/System.err(7454): org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [com.example.testaa.DataGrid] and content type [text/html;charset=UTF-8]

说什么没有合适的HttpMessageConverter,我以为是android端的问题,就换了好几个转换器,结果依旧报错。然后,才发现,原来不是android端的问题,是服务端。服务端每次输出json字符串时,都设置了例如以下属性:

response.setContentType("text/html;charset=UTF-8");

原来是这个原因,于是,将服务端的改动为例如以下:

response.setContentType("application/json;charset=utf-8");

然后,再次执行,OK了,大功告成!这样,我们就能够直接获得到转换为JSON格式之后的对象了。为了添加程序的健壮性,为其加入了ErrorHandler处理。余下代码例如以下:

package com.example.testaa;

/*
 *@author: ZhengHaibo
 *web:     http://blog.csdn.net/nuptboyzhb
 *GitHub   https://github.com/nuptboyzhb
 *mail:    [email protected]
 *2014-1-12  Nanjing,njupt,China
 */
public class Userinfo {
	/**
	 * {field : ‘yhm‘,title : ‘username‘,width : 150},
			{field : ‘pwd‘,title : ‘password‘,width : 150},
			{field : ‘yhqx‘,title : ‘用户权限‘,width : 150},
			{field : ‘zcsj‘,title : ‘注冊时间‘,width : 150},
			{field : ‘bz‘,title : ‘备注‘,width : 180}] ];
	 */
	private String id;
	private String yhm;
	private String pwd;
	private String yhqx;
	private String zcsj;
	private String bz;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getYhm() {
		return yhm;
	}
	public void setYhm(String yhm) {
		this.yhm = yhm;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getYhqx() {
		return yhqx;
	}
	public void setYhqx(String yhqx) {
		this.yhqx = yhqx;
	}
	public String getZcsj() {
		return zcsj;
	}
	public void setZcsj(String zcsj) {
		this.zcsj = zcsj;
	}
	public String getBz() {
		return bz;
	}
	public void setBz(String bz) {
		this.bz = bz;
	}
}

DataGrid类

/*
 * $filename: DataGrid.java,v $
 * $Date: 2013-10-11  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package com.example.testaa;

/*
 *@author: ZhengHaibo
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2013-10-11  Nanjing,njupt,China
 */
public class DataGrid{
    private int total;
    private Userinfo[] rows;
	public Userinfo[] getRows() {
		return rows;
	}
	public void setRows(Userinfo[] rows) {
		this.rows = rows;
	}
	public int getTotal() {
		return total;
	}
	public DataGrid(int total, Userinfo[] rows) {
		this.total = total;
		this.rows = rows;
	}
	public DataGrid( ) {
	}
	public void setTotal(int total) {
		this.total = total;
	}
}

ErrorHandler

/*
 * $filename: ErrorHandlerForUserService.java,v $
 * $Date: 2014-4-29  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package com.example.testaa;

import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.api.rest.RestErrorHandler;
import org.springframework.web.client.RestClientException;

import android.content.Context;
import android.util.Log;
import android.widget.Toast;

/*
 *@author: ZhengHaibo
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2014-4-29  Nanjing,njupt,China
 */
@EBean
public class MyErrorHandler implements RestErrorHandler {

	@RootContext
	Context context;

	@Override
	public void onRestClientExceptionThrown(RestClientException e) {
		// TODO Auto-generated method stub
		e.printStackTrace();
		Log.d("REST", e.toString());
		showError();
	}

	@UiThread
	void showError(){
		Toast.makeText(context, "Rest Error...", Toast.LENGTH_SHORT).show();
	}

}

剩下的就是MainActivity

package com.example.testaa;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.rest.RestService;
import org.springframework.http.ResponseEntity;

import android.app.Activity;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
/*
 *@author: ZhengHaibo
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2014-4-15  Nanjing,njupt,China
 */
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

	private static final String TAG="AAREST";
	@ViewById
	Button getUser;

	@ViewById
	TextView myTextView;

	@RestService
	UserService userService;

	@Bean
	MyErrorHandler  errorHandlerForUserService;

	@AfterViews
	void afterView(){
		//设置ErrorHandler
		userService.setRestErrorHandler(errorHandlerForUserService);
	}
	/**
	 * 获取用户列表
	 */
	@Click
	void getUser() {
		getUserInBackground();
	}
	/**
	 * 获取用户列表
	 * 无需登录
	 */
	@Background
	void getUserInBackground(){
		//String result = userService.getUserInfoList();
		//Gson gson = new Gson();
		//DataGrid  dataGrid = gson.fromJson(result, DataGrid.class);
		ResponseEntity<DataGrid> responseEntiy = userService.getUserInfoList();
		if(null == responseEntiy){
			return;
		}
		DataGrid  dataGrid = responseEntiy.getBody();
		Userinfo[] userinfos= dataGrid.getRows();
		String string = "";
		for(Userinfo userinfo:userinfos){
			string = string + "user:"+ userinfo.getYhm();
			Log.d(TAG, userinfo.getYhm());
		}
		Log.d(TAG, string);
		displayTextView(string);
	}

	@UiThread
	void displayTextView(String string){
		myTextView.setText(string);
	}
}

总结:

整个项目使用AndroidAnnotation框架。本次博客主要解决服务端和android进行json交互的情况。

缺点:Response的setContentType设置改动后,可能影响原站点对浏览器的支持,因此,须要依据不同场景进行选择。

整个项目下载地址:http://download.csdn.net/detail/nuptboyzhb/7283863

未经同意,不得用于商业目的

时间: 2024-10-19 20:44:49

Androidannotation使用之@Rest与server交互的JSON数据转换(二)的相关文章

Androidannotation使用之@Rest与服务器交互的JSON数据转换(二)

开篇 之前的一篇博客:Androidannotation使用之@Rest获取资源及用户登录验证(一):http://blog.csdn.net/nupt123456789/article/details/24384713 主要写了Rest在用户登录的时候,需要JSESSION字段的问题.本博客主要写JSON格式的转换. @Rest的参考文档: https://github.com/excilys/androidannotations/wiki/Rest-API#rest 简介: 从上一篇博客中,

ASP.NET MVC与Sql Server交互,把字典数据插入数据库

在"ASP.NET MVC与Sql Server交互, 插入数据"中,在Controller中拼接sql语句.比如: _db.InsertData("insert into Product(Name,quantity,Price) values('"+productVm.Name+"','"+productVm.Quantity+"','"+productVm.Price+"')"); 在某些场景中需要把数

angularjs与server交互

真正的应用须要和真实的server进行交互,移动应用和新兴的Chrome桌面应用可能是个例外,可是对于此外的全部应用来说,不管你是想把数据持久化到云端.还是须要与其它用户进行实时交互.都须要让应用与server进行交互. 为了实现这一点.Angular提供了一个叫做$http的服务.它提供了一个可扩展的抽象方法列表.使得与server的交互更加easy. 它支持HTTP.JSONP和CORS方式.它还包括了安全性支持.避免JSON格式的脆弱性和XSRF.它让你能够轻松地转换请求和响应数据,甚至还

Project Server 2013新手入门 (二)为PWA用户分配权限

上一篇文章我们讲到怎么为project server 2013 的PWA网站添加用户,那么用户添加好了,我们怎么给这些用户设置相应的权限,来对应我们项目管理中不同的角色(项目经理,资源经理.员工.负责人等),以便他们在项目整个过程中行使的权利和责任体现在我们的Project Server PWA的项目管理中心. 为用户分配PWA的全局权限(关于这个全局权限,我会在以后的文章中介绍) 执行完以上步骤之后,我们将在Project Server 2013 "服务器设置"下管理用户. 1)返回

jQuery form插件的使用--处理server返回的JSON, XML,HTML数据

详细代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>jQuery form插件的使用--处理server返回的JSON, XML,HTML数据</title> <meta http-equiv="Content-Type" content="text/html;

SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初子午线.计量单位.投影等相关理论知识,我们可以使用这些空间参照系统组件来定义一系列应用于地球空间上的几何图像来表示地理空间中的特定功能,表示着地球上一个一个特定的位置点. 本篇主要介绍地理空间索引的概念以及微软SQL Server 2008 R2中的空间索引的应用. 一.空间索引 空间索引是指依据空

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 本篇文章是系列文章中的第二篇,以防你还没有看过第一篇.上一篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 简介 每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging技术来保证了事务日志的原子性和持久性.而这项技术不仅仅保证了ACID

SQL Server 中的 JSON 数据

下面是 JSON 文本的示例 [{ "name": "John", "skills": ["SQL", "C#", "Azure"]}, { "name": "Jane", "surname": "Doe"}] 通过使用 SQL Server 内置函数和运算符,你可以对 JSON 文本执行以下操作: 分析 J

ASP.NET MVC与Sql Server交互, 插入数据

在"ASP.NET MVC与Sql Server建立连接"中,与Sql Server建立了连接.本篇实践向Sql Server中插入数据. 在数据库帮助类中增加插入数据的方法. public class SqlDB { protected SqlConnection conn; //打开连接 public bool OpenConnection() { conn = new SqlConnection(ConfigurationManager.ConnectionStrings[&qu