Http Post发送json序列请求(json序列化和反序列化)

简介:

项目中竟然遇到了这样的问题,要求客户端请求的方式为:参数按照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都是下边这种方式:

[java]  view plain copy
  1. try {  
  2.     jObj = new JSONObject(resultString);  
  3. catch (JSONException e) {  
  4.     // TODO Auto-generated catch block  
  5.     e.printStackTrace();  
  6. }  
resultString是json类型的字符串,当转化为JSONObject类之后,我们还需要一个一个的去解析数据

[java]  view plain copy
  1. int status =jObj.getInt("Status");  
  2. String msgString = jObj.getString("Msg");  
你是不是会感觉到这样很麻烦呢,特别是对于用的比较多的值得时候。谷歌也发现了这个问题,他们开发出了一个json反序列化包。我们可以将返回的键值格式转化为类的格式,这个时候当我们再次使用的时候,就是类名.属性名就可以获取该变量的值了。我在这里摘取几行关键的代码,

[java]  view plain copy
  1. //httpget请求返回结果  
  2.     String str = Common.requestApi("此处填写URL地址 ");  
  3.     System.out.println("str" + str);  
  4.     //json反序列化函数  
  5.     MagazineCategoryResp magazineCatagoryList = gson.fromJson(str, MagazineCategoryResp.class);  
  6.     Message message = new Message();  
  7.     message.what = 1;  
  8.     //把类赋值给message  
  9.     message.obj = magazineCatagoryList;  
  10.     //发送handler信息  在handler里面进行接收  
  11.     handler.sendMessage(message);  

就这样就可以实现json反序列化了,这是在handler里面进行处理的,一般情况下我们都是通过网络获取json格式的数据的。反序列化之后我们就可以在handler里面接受该类,然后就可以非常方便的使用变量值了。因为URL是公司的,所以我注释掉了,返回值的类型在源代码里我把打印出来信息放到了注释里,这次得到的编码格式不是UTF-8的,大家凑合着看吧。

handler里面处理数据代码

[java]  view plain copy
  1. Handler handler = new Handler(){  
  2.     @Override  
  3.     public void handleMessage(Message msg) {  
  4.         switch (msg.what) {  
  5.         case 1:  
  6.             //反序列化结果在handler里使用  
  7.             MagazineCategoryResp magazineCatagoryList = (MagazineCategoryResp) msg.obj;  
  8.             //这里打印查看结果  可以以类的方式获取json值  
  9.             System.out.println("Result=" + magazineCatagoryList.data.get(0).name);  
  10.             tvTest.setText(magazineCatagoryList.data.get(0).name);  
  11.             break;  
  12.         }  
  13.         super.handleMessage(msg);  
  14.     }  
  15. };  

结果只是测试用的,所以直接使用了get(0)

    这里也使用了handler机制,还有进度条的使用,如果有不懂得可以去论坛里找相关的教程和例子。CSDN上也有很多大牛的博客里也有提及。

代码下载








相关文章
|
2月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
2月前
|
存储 Java 数据库
|
11天前
|
JSON 编译器 Go
Golang深入浅出之-结构体标签(Tags):JSON序列化与反射应用
【4月更文挑战第22天】Go语言结构体标签用于添加元信息,常用于JSON序列化和ORM框架。本文聚焦JSON序列化和反射应用,讨论了如何使用`json`标签处理敏感字段、实现`omitempty`、自定义字段名和嵌套结构体。同时,通过反射访问标签信息,但应注意反射可能带来的性能问题。正确使用结构体标签能提升代码质量和安全性。
10 0
|
11天前
|
网络架构 Python
在Flask中,如何定义路由并处理HTTP请求的不同方法(GET、POST等)?
【4月更文挑战第25天】在Flask中,使用`@app.route()`装饰器定义路由,如`/hello`,处理GET请求返回'Hello, World!'。通过添加`methods`参数,可处理不同HTTP方法,如POST请求。单一函数可处理多种方法,通过检查`request.method`区分。动态路由使用 `<variable_name>` 传递URL变量到视图函数。这些基础构成处理HTTP请求的Flask应用。
16 1
|
19天前
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
39 1
|
23天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
27 5
|
28天前
|
存储 缓存 JSON
|
1月前
|
Go
go语言的http post推送
go语言的http post推送
11 1
|
1月前
|
Java
Java编写Http的Get和Post请求示例代码
Java编写Http的Get和Post请求示例代码
29 2
|
2月前
|
存储 JSON JavaScript
Python中的JSON与Pickle模块:数据序列化和反序列化的利器
在Python编程中,数据的序列化和反序列化是经常遇到的操作。序列化是将数据结构或对象状态转换为可以存储或传输的格式的过程,而反序列化则是这个过程的逆操作,即将序列化的数据重新转换回原来的数据结构或对象状态。Python中的JSON和Pickle模块就是实现数据序列化和反序列化的强大工具。