今天在博客园首页看到一篇关于写 RESTful, 大致就是前端定义的一种规范. 原文如下,

https://www.cnblogs.com/zhangmumu/p/11936262.html

看了一圈才发现,  在目前的公司,  4年来一直在用这种 "规范",  感觉也就是约定俗成的东西.

首先说一下, API接口的 路由配置 WebApiConfig.cs

第一步: 代码如下,  这里路由格式为     v1/{controller}/{id}   , 版本 指定 v1

 public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "v1/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnableSystemDiagnosticsTracing();
}
}

第二步: 对于API接口 返回的内容, 做一个规范 (这里一般返回json数据) , 结果实体类如下:

 //WebAPI 数据结果类
public class Root<T>
{
public bool Result { get; set; }
public string ErrorCode { get; set; }
public string Message { get; set; } public T Data { get; set; } public Root()
{ } public Root(bool r, string e, string m)
{
Result = r;
ErrorCode = e;
Message = m;
} public Root(bool r, string e, string m, T data)
{
Result = r;
ErrorCode = e;
Message = m;
Data = data;
} }

第三步: API 接口定义

  public class GetXxDataController : ApiController
{
// 这里有一行权限验证 代码 (...)
public HttpResponseMessage Post([FromBody]QueryParms parms) //QueryParms 是一个 类,参数字段都在这个类里面
{
string msg;
try
{
string json = new XxDataBLL().QueryXxData(parms); //直接返回 json信息

//如果是返回某一个实体类(或者List<T>) , 将其 json 序列化一下.

// string json = Newtonsoft.Json.JsonConvert.SerializeObject(List<T>);

                Root<string> root = new Root<string>()
{
Result = true,
ErrorCode = "0",
Message = "",
Data = json
};

              
/*  
//或者直接 返回 Root<T>
                List<XxData> dataList = new XxDataBLL().QueryXxDataList(parms);//一个查询方法, 返回一个 List<T>

                Root<XxData> root = new Root<XxData>()

                  {
             Result = true,
                  ErrorCode = "0",
                 Message = "接口调用成功!",
               Data = 
dataList

           };

              */
               return Request.CreateResponse(HttpStatusCode.OK, root);
            }
catch (Exception ex)
{
if (ex.InnerException != null)
{
msg = ex.InnerException.Message;
}
else
{
msg = ex.Message;
}
return Request.CreateResponse(HttpStatusCode.OK, new Root<string>(false, "-1", msg)); //如果出错返回一个错误的json, 状态是 false.
} } }

补充一下后续的使用:

页面前端调用API 我就不说了, 反正一般 就是 jquery ajax 之类的.

后端调用API统一方案

1.准备好 调用 POST的 参数

string newUrl=" http://xxxx.xxxx.xxxx.xxxx/XxDataAPI/v1/GetXxData";

string postdata="account=?&pwd=?&id=?"; // 将?替换成对应的参数值

2. 后台方法

   public string GetJsonDataByPostUrl(string newUrl, string postString)
{
byte[] postData = System.Text.Encoding.UTF8.GetBytes(postString); //编码,尤其是汉字,事先要看下抓取网页的编码方式
using (WebClient client = new WebClient())
{
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
//采取POST方式必须加的header,如果改为GET方式的话就去掉这句话即可
client.Headers.Add("Accept", "application/json, text/javascript, */*; q=0.01"); byte[] responseData = client.UploadData(newUrl, "POST", postData); //得到返回字符流 string jsonstr = Encoding.UTF8.GetString(responseData); return jsonstr;
}
}

然后调用:

string json = GetJsonDataByPostUrl(newUrl, postdata); //先拿到接口返回的json, 可以写日志记录下来, 顺便把接口调用的参数也记录下来

Root<XxData> xxdata = JsonConvert.DeserializeObject<XxData>(json);
if (xxdata !=null&&xxdata.Result == true)
{
//使用逻辑....
}

如果  接口返回的是一个实体类对象(或者list<T>)  , 但是 原接口出错, 返回   new Root<string>(false, "-1", msg);

Root<XxData> xxdata = JsonConvert.DeserializeObject<XxData>(json); 反序列化之后, 得到的对象 xxdata.Result 就是 false,

回头查问题, 看看日志里面记录的json 日志信息就行了.
												

关于RESTful 的使用(实战)的更多相关文章

  1. <<Java RESTful Web Service实战>> 读书笔记

    <<Java RESTful Web Service实战>> 读书笔记 第一章   JAX-RS2.0入门 REST (Representational State ransf ...

  2. 从0使用Ruby on Rails打造企业级RESTful API项目实战之我的云音乐

    本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTful API项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图. 课程简 ...

  3. 从 0 使用 SpringBoot MyBatis MySQL Redis Elasticsearch打造企业级 RESTful API 项目实战

    大家好!这是一门付费视频课程.新课优惠价 699 元,折合每小时 9 元左右,需要朋友的联系爱学啊客服 QQ:3469271680:我们每课程是明码标价的,因为如果售价为现在的 2 倍,然后打 5 折 ...

  4. RESTful Web Service实战 小结1

    1 REST的基本实现形式HTTP+URI+XML,但不是唯一形式.XML后来被Json格式替代.REST是一中架构风格(Representational State Transfer,表述性状态转移 ...

  5. Spring Boot & Restful API 构建实战!

    作者:liuxiaopeng https://www.cnblogs.com/paddix/p/8215245.html 在现在的开发流程中,为了最大程度实现前后端的分离,通常后端接口只提供数据接口, ...

  6. 基于MVC的RESTFul风格API实战

    基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...

  7. SpringMVC+RestFul详细示例实战教程

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  8. 带你入门带你飞Ⅱ 使用Mocha + Chai + SuperTest测试Restful API in node.js

    目录 1. 简介 2. 准备开始 3. Restful API测试实战 Example 1 - GET Example 2 - Post Example 3 - Put Example 4 - Del ...

  9. RESTful WebService 入门实例

      /* 新建MavenProject,使用以下代码,创建类和POM文件.使用命令行切换到Project根目录,运行mvn package(或者,选中pom.xml 文件右键单击 > run a ...

  10. Vue2构建项目实战

    转载整理自http://blog.csdn.net/fungleo/article/details/77575077 vue构建单页应用原理 SPA 不是指水疗.是 single page web a ...

随机推荐

  1. C++面向对象编程之虚指针、虚表

    1.当编译器看到一个函数调用,有2个考量:静态绑定or动态绑定 静态绑定是"call xxx",xxx 是表示地址,call 是汇编语言的一个动作,它一定会调用到某个地址: 当符合 ...

  2. 从 Paxos 到 ZooKeeper

    分布式一致性 分布式文件系统.缓存系统和数据库等大型分布式存储系统中,分布式一致性都是一个重要的问题. 什么是分布式一致性?分布式一致性分为哪些类型?分布式系统达到一致性后将会是一个什么样的状态? 如 ...

  3. 监控 HTTP 服务器的状态(测试返回码)shell脚本

    #!/bin/bash # 监控 HTTP 服务器的状态(测试返回码) # 设置变量,url为你需要检测的目标网站的网址(IP 或域名),比如百度 url=http://http://183.232. ...

  4. 使用thymeleaf将查询的数据显示在前台。通过使用循环的形式

    1.需要注意的点. 在 <tr th:each="book:${bookList}">中.book是自己命令的变量.${bookList}是将查询的数据放入这里,需要后 ...

  5. Python 嵌入式打包 (图文)

    Python嵌入式打包过程 目录 Python嵌入式打包过程 下载嵌入式包 解压和配置 安装pip和其他依赖 启动项目 python嵌入式打包:将python环境与项目代码打包到同一个文件夹中,在其他 ...

  6. linux读写一个NTFS分区

    为了读写一个NTFS分区的数据,挂载的时候出现错误提示如下: root@tv:/home/xx# mount -t ntfs-3g /dev/sdb1 /media/sxx/硬盘B-临时文件 The ...

  7. centos7离线安装PHP7

    环境 centos7.9 PHP7.4.30 准备工作 在编译PHP时会提示一些包版本不够或者缺少某些包,一般选择yum来安装缺少的包,但因为是离线安装,所以可以手动配置本地yum源.先看一下系统版本 ...

  8. 如何使用vscode快速配置C语言环境(简单实用)

    需要用到的工具: VSCode(Visual Studio Code) 一.首先打开官网链接,然后根据自己的电脑选择合适的安装程序进行下载. 二.在安装时默认点击下一步,最后记得勾选上添加path到系 ...

  9. spring源码解析(二) 结合源码聊聊FactoryBean

    一.什么是FactoryBean FactoryBean是由spring提供的用来让用户可以自定bean创建的接口:实现该接口可以让你的bean不用经过spring复杂的bean创建过程,但同时也能做 ...

  10. 【JAVA】详解在JAVA中int与Integer的区别以及背后的原因。

    区别 首先我们要明确,这两点之间有什么区别? 主要有以下几点: 数据类型不同:int是基础数据类型,而 Integer是包装数据类型: 默认值不同:int的默认值是 0,而 Integer的默认值是 ...