概述
项目中竟然遇到了这样的问题,要求客户端请求的方式为:参数按照json序列化,然后使用post方式传递给服务器。第一次看到这个东东有点一头雾水,刚开始开发的时候全部使用的get请求方式,因为当时公司不考虑数据安全问题。后来使用了post方式,使用到了session。这下倒好接触了序列化json,然后post方式提交。
首先需要引用谷歌的gson.jar文件,这里面有一些序列化参数的方法,我用到的比较简单直接使用了tojson(类名字); 定义最外层的类PostArgs:
public class PostArgs {
public BaseRequest baseRequest;
public String newsId;
}
里面嵌套BaseRequest类,
public class BaseRequest {
public String action;
public String version;
public UserInfo userInfo;
}
接着是第三层UserInfo类:
public class UserInfo {
public String userId;
public String userName;
}
在主程序里测试为:
PostArgs postArgs = new PostArgs();
BaseRequest baseRequest = new BaseRequest();
UserInfo userInfo = new UserInfo();
userInfo.userId = "walker";
baseRequest.action = "getAction";
baseRequest.version = "1.1.1";
postArgs.baseRequest = baseRequest;
postArgs.newsId = "1000.1";
baseRequest.userInfo = userInfo;
Gson gson = new Gson();
System.out.println(gson.toJson(postArgs));
输出结果为:
{"baseRequest":{"action":"getAction","userInfo":{"userId":"walker"},"version":"1.1.1"},"newsId":"1000.1"}
这样就完成了json的序列化。接下来就是把序列化的数据以post的方式提交给服务器了。
/*
* post请求,
*/
public static String post(String httpUrl, String parMap,Context context)
{
System.out.println("post:"+httpUrl);
InputStream input = null;//输入流
InputStreamReader isr = null;
BufferedReader buffer = null;
StringBuffer sb = null;
String line = null;
AssetManager am = null;//资源文件的管理工具类
try {
/*post向服务器请求数据*/
HttpPost request = new HttpPost(httpUrl);
StringEntity se = new StringEntity(jsonArgs);
request.setEntity(se);
HttpResponse response = new DefaultHttpClient().execute(request);
int code = response.getStatusLine().getStatusCode();
System.out.println("postCode= " + code);
// 若状态值为200,则ok
if (code == HttpStatus.SC_OK) {
//从服务器获得输入流
input = response.getEntity().getContent();
isr = new InputStreamReader(input);
buffer = new BufferedReader(isr,10*1024);
sb = new StringBuffer();
while ((line = buffer.readLine()) != null) {
sb.append(line);
}
}
} catch (Exception e) {
//其他异常同样读取assets目录中的"local_stream.xml"文件
System.out.println("HttpClient post 数据异常");
e.printStackTrace();
return null;
} finally {
try {
if(buffer != null) {
buffer.close();
buffer = null;
}
if(isr != null) {
isr.close();
isr = null;
}
if(input != null) {
input.close();
input = null;
}
} catch (Exception e) {
}
}
System.out.println("PostData:"+sb.toString());
return sb.toString();
}
关键语句就两行:
StringEntity se = new StringEntity(jsonArgs);
request.setEntity(se);
new一个StringEntity,然后把这个当做request的参数设置进去就OK了。
现在客户端基本上返回值基本上也是json格式的值了,post之后返回的字段就可以使用反序列化的方式了。参考http://blog.csdn.net/walker02/article/details/8105936
Android开发中相当便捷的JSON反序列化实现(含源代码) 连带有handler和进度条功能
在开发的应用程序的过程中,我相信json是使用最多的轻量级的数据交换格式,这里我就不介绍有关json的概念了。主要说明一下有关json反序列化的问题,一般情况下我们解析json都是下边这种方式:
- try {
- jObj = new JSONObject(resultString);
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- int status =jObj.getInt("Status");
- String msgString = jObj.getString("Msg");
- //httpget请求返回结果
- String str = Common.requestApi("此处填写URL地址 ");
- System.out.println("str" + str);
- //json反序列化函数
- MagazineCategoryResp magazineCatagoryList = gson.fromJson(str, MagazineCategoryResp.class);
- Message message = new Message();
- message.what = 1;
- //把类赋值给message
- message.obj = magazineCatagoryList;
- //发送handler信息 在handler里面进行接收
- handler.sendMessage(message);
就这样就可以实现json反序列化了,这是在handler里面进行处理的,一般情况下我们都是通过网络获取json格式的数据的。反序列化之后我们就可以在handler里面接受该类,然后就可以非常方便的使用变量值了。因为URL是公司的,所以我注释掉了,返回值的类型在源代码里我把打印出来信息放到了注释里,这次得到的编码格式不是UTF-8的,大家凑合着看吧。
handler里面处理数据代码
- Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 1:
- //反序列化结果在handler里使用
- MagazineCategoryResp magazineCatagoryList = (MagazineCategoryResp) msg.obj;
- //这里打印查看结果 可以以类的方式获取json值
- System.out.println("Result=" + magazineCatagoryList.data.get(0).name);
- tvTest.setText(magazineCatagoryList.data.get(0).name);
- break;
- }
- super.handleMessage(msg);
- }
- };
结果只是测试用的,所以直接使用了get(0)
这里也使用了handler机制,还有进度条的使用,如果有不懂得可以去论坛里找相关的教程和例子。CSDN上也有很多大牛的博客里也有提及。
代码下载
最后
以上就是无辜石头为你收集整理的Http Post发送json序列请求(json序列化和反序列化)的全部内容,希望文章能够帮你解决Http Post发送json序列请求(json序列化和反序列化)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复