JSON参数
JSON(JavaScript Object Notation,JavaScript 对象表示法),多么简单,不就是键值对嘛。
可是每次在前后端之间通过json作为参数传递,我都心烦意乱,甚至吓到面无人色。
何故?因为没搞懂咯。
现在也是一知半解。是时候做一个总结了。
1、前端传送给后端
$.ajax({
url: "/api/customview/SetTags?projectId=0&account=leftfist",
data: JSON.stringify(jsonObj),//这个JSON.stringify函数是js自带的,作用是将JSON对象序列化为字符串
dataType: "json",
type: "POST",
contentType: "application/json; charset=utf-8",
success: function (data) {//成功后回调函数
alert(data);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + ": " + errorThrown);
}
});
上述例子中,URL含有参数,但json对象不在这些参数中。而是以提交的方式,放在消息体里面传送。http协议,前端到后端,是由请求行 + 请求报头 + 消息正文组成的,后端到前端,是由响应行 + 相应报头 + 消息正文组成。我估计,json对象,即放在消息正文中。
2、后端接收前端
后端,我这里以asp.net web api为例。
- [System.Web.Http.HttpPost]
- public bool SetTags(int projectId, string account, SetViewTag svt)
- {//此为对应前端的请求API:url: "/api/customview/SetTags?projectId=0&account=leftfist"
- List<ViewTag> lisVt = new List<ViewTag>();
- assemblyViewTagList(ref lisVt,svt.Updated,ViewTag.EChangeType.Update);
- assemblyViewTagList(ref lisVt, svt.Deleted, ViewTag.EChangeType.Remove);
- return customViewService.SetTags(projectId,account,lisVt);
- }
- void assemblyViewTagList(ref List<ViewTag> lisVt,string strJson,ViewTag.EChangeType ctype)
- {
- if (strJson.Length == 0) return;
- //JsonConvert.DeserializeObject<> 是Newtonsoft.Json 的方法,作用是将JSON字符串反序列化,转换回JSON对象
- //注意里面的泛型
- List<ViewTag> items = JsonConvert.DeserializeObject<List<ViewTag>>(strJson);
- foreach (ViewTag vt in items)
- {
- vt.ChangeType = (byte)ctype;
- lisVt.Add(vt);
- }
- }
- public class SetViewTag
- {
- public string Updated { get; set; }
- public string Deleted { get; set; }
- }
- public class ViewTag
- {
- public int ViewId { get; set; }
- public string Name { get; set; }
- public bool IsValid { get; set; }
- public int Seq { get; set; }
- public byte ChangeType { get; set; }
- public enum EChangeType : byte { NoChanged = 0,Update,Remove}
- }
3、前端接收后端
假设后端有WCF的接口:
- <span style="font-size:10px;"> static readonly DateTime dtZone = new DateTime(1970, 1, 1, 0, 0, 0);
- public Stream GetUTC()
- {
- DateTime utc = DateTime.Now.ToUniversalTime();
- return GetStream(String.Format(@"{{""data"":""{0}""}}", (long)utc.Subtract(dtZone).TotalMilliseconds));
- }</span>
- <span style="font-size:10px;"> /// <summary>
- /// 辅助方法,用于输出流
- /// </summary>
- /// <param name="str"></param>
- /// <returns></returns>
- private Stream GetStream(string str)
- {
- MemoryStream ms = new MemoryStream();
- StreamWriter sw = new StreamWriter(ms);
- sw.AutoFlush = true;
- sw.Write(str);
- ms.Position = 0;
- WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
- return ms;
- }</span>
前端则有
- function getLocationTime(){
- var url = _webUrl + "/Attendance.svc/GetUTC";
- var xhr;
- xhr = new XMLHttpRequest();
- if (xhr) {
- xhr.onerror = function () { alert("erro"); };
- xhr.ontimeout = function () { alert("Time out"); };
- xhr.onload = function () {
- var data = $.parseJSON(xhr.responseText);
- serverDateTime = new Date();
- serverDateTime.setTime(data.data * 1);
- timeId = window.setInterval(getCalTimes, 1000);
- };
- xhr.open("get", url, true);
- //xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
- xhr.send(null);
- }
- else {
- alert("Failed to create");
- }
- }
前端这里使用了 XMLHttpRequest(),主要是照顾IE。如果用纯ajax,可以:
- $.ajax({
- url: _webUrl + "/Attendance.svc/GetUTC";,
- type: "GET",
- success: function (data) {//成功后回调函数
- //假如这个data是json字符串,则 obj 得到json对象
- var obj = eval("(" + data + ")");
- },
- error: function (XMLHttpRequest, textStatus, errorThrown) {
- alert(textStatus + ": " + errorThrown);
- }
- });
3、前端接收后端-2
asp.net web api 默认的结果传送方式是XML。但可以设置为JSON。方法为在WebApiConfig里加入一句:
- public static class WebApiConfig
- {
- public static void Register(HttpConfiguration config)
- {
- // Web API 路由
- config.MapHttpAttributeRoutes();
- config.Routes.MapHttpRoute(
- name: "DefaultApi",
- routeTemplate: "api/{controller}/{action}/{id}",
- defaults: new { id = RouteParameter.Optional }
- );
- config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));//改为JSON方式
- }
- }
如此,在服务端那些List<>之类只有服务端才能明白的东西,在前端接收到时一律是JSON。
JSON参数的更多相关文章
- JSON参数解析工具类
/// <summary> /// 解析JSON参数 /// </summary> public class JSONParser { JObject jObj = null; ...
- Servlet端 接收不到4096,8192长度的JSON参数
Servlet端的日志显示,客户端传过来的JSON参数是空值. 但是在客户端的日志显示,已将JSON参数传送过去. 经调查发现,加减1位后的JSON参数均可以正常传送. 只有8192,4096长度的J ...
- c# HttpWebRequest 模拟HTTP post 传递JSON参数
//HTTP post JSON 参数 private string HttpPost(string Url, Object ticket) { ...
- python接口自动化-传 json 参数
一.post请求有两种方法传json参数: 1.传json参数(自动转 json ) 2.传data参数(需 json 转换) 代码参考: payload = { "Jodie": ...
- SpringBoot配置Swagger实例(POST接收json参数)
工程目录结构: 首先,引入jar包,只需要以下两个即可 <dependency> <groupId>io.springfox</groupId> <artif ...
- Spring boot中自定义Json参数解析器
转载请注明出处... 一.介绍 用过springMVC/spring boot的都清楚,在controller层接受参数,常用的都是两种接受方式,如下 /** * 请求路径 http://127.0. ...
- wcf json参数返回失败问题
问题: 最近写了一个接口,提示连接失败,于是在本地发布了一下,然后模拟post请求进行本地调试,发现能正常进入接口,中间也没问题,一直走到最后一步return时,也能return,但是就是返回不了数据 ...
- SpringMVC接受JSON参数详解及常见错误总结我改
SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...
- SpringMVC接受JSON参数详解及常见错误总结
SpringMVC接受JSON参数详解及常见错误总结 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一 ...
- C# ContentType: "application/json" 请求方式传json参数问题
处理Http请求时遇到的ContentType为application/json方式,记录下这种Post请求方式下如何传json参数: var request = (HttpWebRequest)We ...
随机推荐
- python note of class
reference: https://www.zhihu.com/question/27699413/answer/267906889 摘要: 我们在描述一个真实对象(物体)时包括两个方面:它可以做什 ...
- weblogic启动 web应用ssh关闭 nohup命令
平时我们操作linux服务器的时候,都是通过ssh远程连接,然后启动服务器上的服务的,所以有时候启动weblogic,我们关闭ssh,weblogic 服务也相应的关闭了,那么我们就只能用nohup这 ...
- BZOJ 2055 80人环游世界 有上下界最小费用可行流
题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...
- <Redis> 入门五 持久化RBD/AOF
RDB RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘(默认是 dump.rdb). 默认持久化机制,就是将内存中的数据以快照的方式写入二进制文件dump.rbd中. 触发快照的条件 ...
- Buffer.compare()
Buffer.compare(buf1, buf2) buf1 {Buffer} buf2 {Buffer} 返回:{Number} 比较 buf1 和 buf2 通常用于 Buffer 数组的排序目 ...
- 12.Spring通过FactoryBean配置Bean
为啥要使用FactoryBean: 在配置Bean的时候,需要用到IOC容器中的其它Bean,这个时候使用FactoryBean配置最合适. public class Car { private St ...
- python3.6的requests库&HTMLTestRunner实现测试报告
'''1. 在suite.addTest时,可以把需要的用例先写入一个列表list中,list当做addTest的参数:2. 在unittest.main(verbosity=2)中,默认为1,设置为 ...
- python接口测试之Http请求(三)
python的强大之处在于提供了很多的标准库,这些标准库可以直接调用,本节部分,重点学习和总结在 接口测试中Python的Http请求的库的学习. 首先来看httplib,官方的解释为:本模块定义了类 ...
- 61. mybatic insert异常:BindingException: Parameter 'name' not found【从零开始学Spring B】
mybatic insert异常:BindingException: Parameter 'name' not found [从零开始学习Spirng Boot-常见异常汇总] 异常信息如下: nes ...
- memcache 原理 & 监测 & 查看状态 & stats & 结构
Mencache内存存储方式:slab/LRU,采用预先申请固定大小的内存页(slab/page),然后再把内存分成多个块(chunk) 先放一张从网上找到的memcache内存结构图,觉得非常的赞: