博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Androidannotation使用之@Rest与server交互的JSON数据转换(二)
阅读量:7282 次
发布时间:2019-06-30

本文共 7052 字,大约阅读时间需要 23 分钟。

开篇

之前的一篇博客::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:    zhb931706659@126.com *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
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:    zhb931706659@126.com *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:    zhb931706659@126.com *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:    zhb931706659@126.com *2014-4-29  Nanjing,njupt,China */@EBeanpublic 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:    zhb931706659@126.com *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
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

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

你可能感兴趣的文章
基于Hadoop的云盘系统客户端技术选型说明
查看>>
linux下C语言多线程编程实例--修改后
查看>>
我的友情链接
查看>>
更新脚本
查看>>
用Android-X86和VMware打造高性能Android开发环境
查看>>
我的友情链接
查看>>
学习Hadoop找到的一些资源
查看>>
经纬度精度差别
查看>>
【08】分析类
查看>>
垃圾收集的种类
查看>>
HRegionServer启动后自动关闭的问题
查看>>
maven插件assembly利用profiles打不同环境发布包
查看>>
Android系统学习总结1--init和Zygote
查看>>
linux 下查看一个进程运行路径
查看>>
CSS 优先级
查看>>
ElasticSearch 集群状态图形化界面:cerebro
查看>>
Spark内存管理模型
查看>>
shell脚本基础
查看>>
shell 脚本总结
查看>>
将非工程下的图片显示到前端jsp的方法
查看>>