分类: 服务器

服务器

HTTP接口的服务端和客户端的实现

Json大量字段案例(300多个key),需要做一个客户中心抽调各个系统的客户信息的功能,在每个系统中需要写客户端代码,在客户中心系统需要写服务端代码。

客户端:

json串截图如下,注意在json结构中有对象也有数组也就是集合。在java类和json对象的互相转换过程中,如果将json串转换成java类对象,在里层的特殊类型,也就是[]集合的,我们需要进行特殊的处理。
%title插图%num

1.创建线程:(向客户中心推送客户信息时,前提是不能影响本系统的流程,也就是说不管你借口中的方法是否报错借口是否通都不能影响源代码的正常秩序,因为我们新增了线程),内部类。

try {

Thread thread = new Thread(new Runnable() {

public void run() {

//次数写客户端调用接口的相关方法

}

});

thread.start();

} catch (Exception e) {

e.printStackTrace();

}

根据json的结构构建出对应的java类来。一层一层的写java类,查询出所有需要的信息赋值到java类对象中后,将对象转化成可以推送的json对象

JSONObject fromObject = JSONObject.fromObject(customerCenter,jsonExcludeEmpty());

private JsonConfig jsonExcludeEmpty(){//去除空的json键值对

JsonConfig jsonConfig = new JsonConfig();

jsonConfig.setJsonPropertyFilter(new PropertyFilter() {

@Override

public boolean apply(Object source, String name, Object value) {

return value == null;

}

});

return jsonConfig;

}

调用HTTP工具类推送信息调用接口,*后获得接口的返回值result.

同样在获取数据本系统做保存时,调用接口后获得返回值result

JSONObject jsonObject = JSONObject.fromObject(result);

String status = jsonObject.getString(“status”).trim();

//过滤掉不需要处理的json对象

JsonConfig  config=new JsonConfig ();

config.setExcludes(new String[]{“educationInfos”,”carInfo”,”houseInfo”});

JSONObject dataJSON = new JSONObject().fromObject(data,config);

//json转java对象特殊的类型需要单独处理,比如list [ ]中括号

Map<String, Class> classMap = new HashMap<String, Class>();

classMap.put(“phones”, CustomerCenterPhone.class);

classMap.put(“companyPhones”, CustomerCenterPhone.class);

classMap.put(“emails”, CustomerCenterEmail.class);

……………………..
CustomerCenter customerCenter =(CustomerCenter)JSONObject.toBean(dataJSON,CustomerCenter.class,classMap);

这样就获得到了*外层整体的对象CustomerCenter ,在这个对象中,我做的这个项目有300多个字段。里面的对象和集合还是比较多的,在做的时候要仔细的核对好。

服务端:

http服务端的代码一般不是在service类或是接口中写,而是直接写在controller中,因为是http的嘛,就和一个页面访问一样先进入到controller层,类的注解不变还是@Controller@RequestMapping(value=”/ApplicationController”)两个后面的是访问的名称。在方法上有了一些变化,先看下面的代码:
@RequestMapping(value=”/approveResult”,method = RequestMethod.POST)
public void approveResult(@RequestBody PharosResultPojo pharosResultPojo,HttpServletRequest request,HttpServletResponse response){
//PharosResultPojo 这个是接受数据的java类
//里面直接写相应的功能,在处理完后,需要给调用者返回处理的结果
PrintWriter out;
out = response.getWriter();
JSONObject result = new JSONObject();
result.put(“result”, “ok”);
out.write(result.toString());
out.flush();
out.close();
}
//我们看到在除了平时要使用的方法访问名称后,又加了个参数method = RequestMethod.POST,这个就是规定你http服务端的这个接口方法是post还是get方式。在方法参数列表中要加上这个注解@RequestBody 以及HttpServletRequest request,HttpServletResponse response两个参数。在controller中写了以上的内容后我们只需要完成*后一步http服务端就完成了。那么我们的java代码已经写好了,想要和页面上的一样访问到我们的后台,那我们还需要一个什么操作呢?既然是接口,那么一般肯定是其它的系统访问,我们知道的是自己系统的类其它类是不能直接去访问的,我们需要将这个类给取消拦截,也就是让其它系统可以访问,这一步是在配置文件中实现的,每个公司的项目的结构一般都不一样,有很多公司是在applicationContext-security.xml这个xml中配置,
<b:bean id=”resourceDetailsService”
class=”*********.security.ResourceDetailsServiceImp”>
<b:property name=”filterURL”>
<b:map>
<b:entry key=”/ApplicationController/**” value=”ROLE_ANONYMOUS” />
直接将这个类给取消拦截,具体的在xml中的写法,有一些是公司封装的比较详细,如果你做的项目什么都没有的话,那么你可以在网上搜索一下如何在spring mvc项目(我公司用的是spring mvc项目这个框架)中取消controller类的访问拦截,应该很简单的。

SDK是什么?与API有什么关系?

SDK是一系列程序接口,文档,开发工具的集合,是的,集合,sdk即单单不是一个开发工具,也不是一个程序。一个完整的SDK应该包括以下内容:(1)接口文件和库文件(2)帮助文档(3)开发示例(4)实用工具。

SDK即“软体开发工具包”,一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。通俗点是指由第三方服务商提供的实现软件产品某项功能的工具包。

通常SDK是由专业性质的公司提供专业服务的集合,比如提供安卓开发工具、或者基于硬件开发的服务等。也有针对某项软件功能的SDK,如推送技术、图像识别技术、移动支付技术、语音识别分析技术等,在互联网开放的大趋势下,一些功能性的SDK已经被当作一个产品来运营。

开发者不需要再对产品的每个功能进行开发,选择合适稳定的SDK服务并花费很少的经历就可以在产品中集成某项功能。

接口文件和库文件就是API,将底层的代码进行封装保护,提供给用户一个调用底层代码的接口;
帮助文档解释接口文件和库文件功能,以及介绍相关的开发工具,操作示例等等;
开发示例就是做出来的一个DEMO展示,也要包括源代码;
实用工具是用来协助用户进行二次开发的工具,比如二次开发向导、API 搜索工具、软件打包工具等。

有过java编程经历的都知道,要运行java需要在电脑上安装jdk。jdk就是java SDK ,其安装过程就是下载一个EXE(Windows下)的应用程序,点一下就OK了,看起来好像jdk就是一个应用程序。实际上这个在网上下载下来的应用程序只是jdk的一个安装向导,它帮你在电脑上安装了Java的运行环境,一堆Java工具和Java基础的类库,这些东西组合起来才是JDK的核心内容。
通过上述的示例,相信你大概明白了sdk包含些什么东西了。

那么学c的同学又会问,为什么在windows下运行c语言,没见要下载什么’C  SDK’什么的啊?
因为C语言没有特定SDK,也不需要像Java一样在虚拟机上运行程序示例。但是C语言有丰富的API,同时C语言不需要像Java一样使用Java开发商提供的API,它可以直接调用系统本身的API。

实际开发中,可以轻松的获得多种多类的软件开发的工具(如keil uvision, eclipse,Visual C++等),这些工具集成了语言的开发环境、编译环境,还提供纠错功能。可以通过这些工具将SDK中的函数,框架类导入,使用别人写好的类,协助软件的开发。

 

=============== API ===============

(1)API的概念

API即“应用程序编程接口”,是一些预先定义的函数,目的是作为“介面”沟通两个不同的东西,提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

其实就是别人已经写好的可以实现特定功能的函数,而你只需要根据他提供好的接口,也就是调用他的方法,传入他规定的参数,然后这个函数就会帮你实现这些功能。

 

从接口interface来说,在计算机领域是指两个不同事物之间交互的地方,大可以到两个完整的不同系统,小可以到两段程序。所以这个I就这么理解。在这个基础上,人和程序交互的地方,叫做UI,user interface,所有人输入的包括鼠标键盘触摸屏声音输入都算。那么程序和程序交互的就叫做API,所有非人对非人交互都通过API进行交互,所谓交互,其实就是传递数据,触发功能。

(2)API应用案例

示例场景:假如你是一家小企业,公司网站上有一个表格是用来给客户注册预约的。你想要凭借这些预约细节信息,让客户能够自动在谷歌日程上创建活动。

API使用:这就意味着,你的网站服务器需要直接与谷歌服务器进行对话,在掌握既定细节信息的情况下,申请创建活动。之后,你的服务器就会接收到谷歌的响应并进行处理,然后将相关信息发送回浏览器,比如说向用户发送一个确认信息。

(3)API产品——现在也有公司将API包装成产品

案例:Weather Underground出售其天气数据API的访问权限给其他人。

(4)API的分类

API又分为(Windows、Linux、Unix等系统的)系统级API,及非操作系统级的自定义API。作为一种有效的代码封装模式,微软Windows的API开发模式已经为许多商业应用开发的公司所借鉴,并开发出某些商业应用系统的API函数予以发布,方便第三方进行功能扩展。如Google、苹果电脑公司,以及诺基亚等手机开发的API等等。

API又分为开放式API和私有API。顾名思义,开放式API即是向所有人公开的接口,允许任何人调用它并获取到它背后的数据,有时公司会将 API 作为其公共开放系统,也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式API。私有API即接口未对外开放。

 

 

========== SDK 和 API 的关系 ==========

SDK相当于开发集成工具环境,API就是数据接口。在SDK环境下调用API数据。

实际上SDK包含了API的定义,API定义一种能力,一种接口的规范,而SDK可以包含这种能力、包含这种规范。但是SDK又不完完全全只包含API以及API的实现,它是一个软件工具包,它还有很多其他辅助性的功能。

SDK 包含了使用 API 的必需资料,所以人们也常把仅使用 API 来编写 Windows 应用程序的开发方式叫做“SDK编程”。

通俗语言解释

API

前端调用后端数据的一个通道,就是我们俗说的接口,通过这个通道,可以访问到后端的数据,但是又无需调用源代码。

SDK

工程师为辅助开发某类软件的相关文档、范例和工具的集合,使用SDK可以提高开发效率,更简单的接入某个功能。

举例说明:一个产品想实现某个功能,可以找到相关的SDK,工程师直接接入SDK,就不用再重新开发了。

 

========== 举个例子 ===========

在这里,一个简单的功能链条我将它分为三个组成部分:

1、客户端组装数据

2、客户端使用组装的数据来请求服务端(或者操作系统)的 api

3、服务端(或者操作系统)的 api 处理数据并返回处理结果

结合这个链条得出结论:

1、api为细粒度的功能接口

2、sdk包含第2、3步

3、sdk为api的集合

什么是API?

何为API?如果你在百度百科上搜索,你会得到如下结果:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。那么再通俗一点来说,API究竟是什么呢?

在我学习软件开发之前,API听起来似乎像是一种啤酒。

而现在,我开始频繁使用这一术语,以至于我在酒吧里都想点一杯API来喝喝看了。

酒保发送的响应是:“查无此酒”——404:找不到该资源。

我碰见过很多人,有科技圈内的,也有圈外的。对于API这样一个常见术语的含义,他们的理解都存在些许偏差或不确定的成分。

从技术角度来说,API指的是应用程序编程接口。大多数大型企业都会为自己的客户建立应用程序编程接口,或供内部使用。

但是你该如何用大白话来解释API这个术语呢?除了在开发和业务中的含义,API是不是有更宽泛的含义呢?首先,让我们退后一步,来了解一下互联网究竟是如何工作的。

WWW和远程服务器

当我想到互联网的时候,我的脑海中浮现出了一个由互联服务器构成的大型网络。

互联网上的每一个界面都被存储在一个远程服务器里。远程服务器也没有大家想的那么神秘——它不过是用来优化处理需求的远程计算机罢了。

为了正确了解API,你可以在自己的笔记本电脑上启动一个能面向网络提供整个网站服务的服务器(事实上,在网站正式上线之前,工程师们就是通过本地服务器来开发网站的)。

当你在浏览器中输入www.facebook.com,一则请求会出现在Facebook的远程服务器上。一旦你的浏览器收到了响应,它就会解析代码、呈现出网页。

对于浏览器来说(这也是所谓的客户端),Facebook的服务器就是一个应用程序编程接口。这意味着每当你在互联网上访问一个页面的时候,你都在与某个远程服务器的API发生交互。

API并不完全等同于远程服务器——它其实是服务器的一部分,负责接收请求并发送响应。

API是一种为客户提供服务的方式

你也许听说过有公司将API包装成产品。举个例子,Weather Underground就会出售其天气数据API的访问权限给其他人。

示例场景:你是一家小企业,公司网站上有一个表格是用来给客户注册预约的。你想要凭借这些预约细节信息,让客户能够自动在谷歌日程上创建活动。

API使用:这就意味着,你的网站服务器需要直接与谷歌服务器进行对话,在掌握既定细节信息的情况下,申请创建活动。之后,你的服务器就会接收到谷歌的响应并进行处理,然后将相关信息发送回浏览器,比如说向用户发送一个确认信息。

此外,你的浏览器通常可以绕过自己的服务器,直接向谷歌服务器发送API请求。

那么谷歌日历的API与其他远程服务器的API存在什么区别呢?

从技术角度来说,不同之处在于请求和响应的形式。

为了提交整个页面,你的浏览器会期待得到HTML格式的响应,这就包括显示代码。而谷歌日历的API只会返回一些数据——大多是与JSON格式相同。

如果你的网站浏览器发出了API请求,之后网站服务器就成为了客户端(当你使用浏览器访问某一网站的时候,你的浏览器也相当于是一个客户端)。

从用户角度来说,API可以让他们无需离开网站就能完成原先的操作。

现今大多数网站至少都会使用一些第三方API。

存在的问题都有了第三方解决方案,但是是以库或服务的形式。使用现有的解决方案已经变得更加方便且可靠了。

开发团队将自己的应用分解到多个可以通过API进行互通的服务器上,这已经是司空见惯的做法了。这些为主应用服务器提供辅助功能的服务器通常被称作是微服务架构。

总结一下,当一家公司为客户提供API的时候,这仅仅意味着它们建立了一组专用的URL通道,用来返回纯数据响应——也就是说,响应内容不会包含图形用户界面(例如网站)中的显示开销。

你能够用自己的浏览器发送这种请求吗?通常都是可以的。由于实际的HTTP传输都是以文本的形式进行的,你的浏览器可以一直达到显示响应的*佳状态。

举个例子,你可以直接通过浏览器访问GitHub的API,而无需访问令牌。如下是你在浏览器中访问GitHub用户API路径时得到的JSON响应:

浏览器似乎可以很好地显示出JSON响应结果。像这样的JSON响应,你就可以直接用在代码中了。从这些文本中,你很容易可以提取出数据,之后你就可以基于这些数据做自己想要做的事情了。

A指的是“应用”(Application)

作为结束,我就再给出几个API的实例吧。

“应用”(Application)可以指代很多事物。如下是它在API语境下的含义:

API:

  1. 一个提供特定功能的软件
  2. 整个服务器、整个应用或一款应用的很小一部分

从本质上来说,任何能从自身环境中分离出来的软件都可以成为API中的“A”,且很可能它本身也是某种API。就这么说吧,你在代码中使用的是第三方库。一旦该库与你的代码整合在了一起,那么这个库也就成为了整体应用的一部分。作为软件中特殊的一部分,库很有可能也拥有一个API,使其与剩余代码进行交互。

还有一个例子:在Object Oriented Design(面向对象编程)中,代码被编成了对象。你的应用程序也许拥有数百个能够实现交互的对象。

每一个对象都有一个API——这是一组公共方法和属性,对象可以用它来与应用中的其他对象进行交互。

对象也许还拥有私有的内部逻辑,这就意味着它在躲避外界环境(那它也就不是一个API)。

从上述讨论的内容来看,我希望你能掌握API的广义,也能了解现今这一术语的常见含义。

web项目API接口设计与开发总结

当前公司自主开发的一个AI图片识别项目,需要对外开放提供接口,领导二话没说把这个任务交给我来做,算是对我的一次考验。虽然以前自己没有设计过接口,但是调用过别人写的接口,如百度提供的接口,还有以前在项目中调用别人的接口等等。感觉调用别人的接口还挺方便的,自己来设计的时候,真不知道如何下手。然后去查看学习各种教程,开始进行接口的设计与开发工作。

 

设计原则

鉴于目前的网络环境形式,设计的首要原则是安全*原则,如果设计的接口不能保证其安全性,其他的活都相当于白干了。其次是简单原则,我认为调用接口的方式越简单越好,因为现在的人都很懒,这一点百度做得很好,调用他们的接口非常简单。如调用百度地图API,一个key就够了。目前只考虑到这两点,其他的还没有总结出来。

 

开发环境

Node.js + WebStorm + MySQL//说明:公司选择JavaScript作为后台开发的主要语言,开发难度估计只有Java的一半,可是现在使用的公司却非常少,搞不懂为什么。据统计NPM上面包的下载量和MAVEN的包下载量不是一个量级的,使用NPM的人超多,比用MAVEN的人多多了。

 

整体设计

这个接口的*终成型不是一下子全部就实现了,而是在工作中不断地改进,在每次改动中不断地变得越来越好,才算完成一个初步的版本。写代码就好比谈恋爱,两个人不可能一下子熟悉起来,立刻热恋,然后马上结婚,特例除外。在开发的过程中需要一直不停的更改,即使是上线了也有可能还需要修改,没有*终版本,因为需求的变动是不确定的。

这个接口是于一个独立的项目,为了在部署时方便,也为了调用时不和正式项目发生冲突,所以单独进行开发。所有的请求分为两大类,一类是获取用户token的请求,一类是进行业务操作的请求。

请求处理的先后顺序:请求拦截器—>获取用户token—->其他业务操作。如下图:
%title插图%num

 

开发过接口的人都知道,一般来说接口是没有页面的,只有后台;并且出于安全起见,所有的请求全部为POST请求。按照上面的设计来进行开发,获取用户token的请求不会被拦截器拦截,这步操作有些类似于用户登录的操作。其他的业务操作全部需要先经过拦截器先处理,验证通过后才放行,验证不通过则返回错误信息。

获取用户token时,需要传递三个参数,用户名、用户密码和一个秘钥key(UUID生成),其中用户密码和秘钥key都使用MD5加密。MD5加密不可逆,为了防止敏感信息被别人窃取,所以采取加密传输。验证通过则返回用户token和私钥,有效时间都是一个小时。秘钥key没有采用特殊的生成规则,比如用户ID+日期+项目名称+随机数字。使用简单的UUID生成32位长度的随机字符,我觉得很low,可是破解的概率*小,既简单又安全还实用。

返回的状态码和消息只有三种:接口调用失败,业务操作成功,业务操作失败。*开始设计时还加了一种接口调用成功,可后来转念一想,这一步有些多余。如果接口调用成功,那一定会进行业务操作,剩下的则是业务操作的事情了,所以把接口调用成功这一状态取消了。

所有操作分为三种情况:

接口调用失败—->返回错误信息;

业务操作成功—>返回操作成功信息;

业务操作失败—->返回业务操作失败信息。
%title插图%num

拦截器设计实现。拦截器用来拦截业务操作的所有请求,进行安全验证。验证的主要内容有:请求IP地址验证—->用户token验证—>rsa签名验证—>秘钥key验证。只有全部通过验证后才放行,否则返回错误信息。如果不清楚rsa加密方式的朋友可以先去百度百科里面了解一下rsa加密方式。

至于业务操作的设计则没有什么特别之处,和平常的增、删、改、查差不多。写一点,关于参数处理,如果可以的话,*好要在后台进行参数校验,我坚信一点,永远不要相信用户会按照你设计的方式来进行操作。所以对于用户输入的所有参数自己会严格验证,验证通过后才让程度进行下一步操作。

 

接口测试

由于接口没有页面,测试时不像一般的页面那样方便,只能采取其他方式来进行测试。同事建议我使用谷歌的一个专业测试软件Postman,自己使用后觉得还将就,不过我认为还是不太方便。然后换用了另外一种本人认为更简单的方式,使用WebStorm 创建一个新项目,只需要导入可以发送POST请求的包即可,然后一个test.js文件搞定所有测试。

秘钥key使用rsa(私钥)加密,token原样传输,参数使用aes加密,然后在在使用rsa(私钥)进行签名操作生成签名字符串。签名主要是为了防止数据在传输过程中被串改,敏感数据则使用rsa私钥加密,然后用公钥解密,也可以使用公钥加密,私钥解密,主要是为了防止被窃取。但是我了解到的是rsa签名只能使用私钥,再使用公钥验证签名。

%title插图%num

   自己创建一个新项目来进行测试,一个接口接着一个接口的测试,很快全部测试完毕,Word文档也同步写好。测试工作完成则表明接口开发的初步版本完成。
遇到的问题
       开发和测试中肯定会遇到各种各样的问题,在此只写几个有代表性的问题。
       *个问题,rsa加密有长度限制,网上说只能加密117个字节,当我加密的数据太长时果然出现问题,比如加密Base64格式的图片信息出问题。为了解决这个问题,所以使用aes来进行加密和解密数据,图片信息也不受影响。
        第二个问题,使用rsa加密的数据中可能会含有加号,开始时我是放在URL中进行传输,之后在解析时会将加号解析为空格,这个问题是采了很久的坑才知道的。左思右想才想到一个很好的解决办法是在解析URL参数后,使用正则表达式将字符串中的空格全部替换为加号,测试完全可行。
       这种方式对于有单个加号的数据可行,可是后面测试时,问题来了。一次数据验证签名一直没有通过,我很奇怪,刚才还好好的,怎么一下子就不行了呢。仔细查找原因才知道,在使用rsa进行数据签名操作时,字符串中出现了三个连续加号如下:
FayA44XDO5jeqDbafkMqzogMZHvJ+l3CX3myjiPYrsyyXV7KJvgjgNeVf+++m/UDNrcTuFQ2DnzR+rngygfJ0Q==  这是我意识到问题的严重性,rsa操作生成的数据*好不要拼接在url中传输,否则会出问题。如果一定要拼接在URL中进行传输,则对加号一定要特殊处理。我的处理方式是所有参数全部放在body中进行传输,这样解析时就不会出问题。
        第三个问题,数据在传输前是JavaScript中的一个对象,不便于传输,为了解决这个问题尝试过不少方法,*终决定采用JSON.stringify()//JSON.parse()这一对函数来解决。因为数据加密只能加密字符串,可以使用JSON.stringify()函数将JSON对象转换为字符串,然后进行加密传输。对字符串进行解密后在使用JSON.parse()函数将字符串转换为JSON对象。测试可行,圆满解决这个问题。
        第四个问题,获取token的请求和其他大的业务请求操作不太一样,在拦截器中我做了一次请求地址的判断,如果请求地址是获取token则直接跳转到对应的方法,否则放行进行其他业务操作。这样做虽然每一次都需要做一次请求判断,可是代码量大大滴减少了,因为每一个请求都需要做IP地址验证,如果不这样处理,则需要把请求地址验证的方法单独写到一个文件中,放在*前面,我没有这样做,感觉这样做比较麻烦,还是使用一个拦截器方便、简单些。
总结
      从这次设计、开发、测试接口中学到不少的东西,虽然这个接口项目还在不断地完善,不过我知道我肯定会做得越来越好。比如关于安全方面,后期肯定还会添加验证,用于防止攻击,如防止频繁的请求攻击,只限制post请求进入等等。
      真实的项目开发中学习到的这些东西印象都会非常深刻,不容易忘记。自己平时也在学习其他的编程语言比如Python,学习完后没有使用起来会很快忘记。在工作中则不一样,可以做到真正的学以致用,学习到的东西需要马上使用,这时印象会非常的深刻。
      学到老,活到老是我一贯坚持的信条,写这篇博文分享出来也算是对自己工作的一种总结,一种学习。如果各位开发的朋友有不懂的或者是有更好建议,欢迎留言。

服务端编写API总结

1.服务端返回的数据都是*终都是经过json_encode处理的,格式基本上是

$response = [
‘code’=> 200,//状态码
‘msg’=> ‘请求成功’,//提示信息
‘data’=> $data//返回数据
];

其中$data可以是数组,如果$data为关联数组或者无序数组这会返回为对象

关联数组
$data = [
‘name’=>’bread’,
‘price’=>’8.05’,
‘attr’=> ‘都是感受到三个’,
‘date’=> ‘2018-05-01′
];
无序数组
$data = [
0=>’test1′,1=>’test2′,3=>’test3′,4=>’test4’
];

是有序数组就返回为数组

$data = [‘www.sdsf.com/sdf2334.png’,’www.sdsf.com/sdf24334.png’,’www.sdsf.com/df234.png’,’www.sdsf.com/srw34.png’];

json_encode递归循环格式化也是这个方式
2.$data中千万不要有json_encode的字符串,否则客户端接受时无法还原.就算数据库保存的为json字符串,也应该还原成数组再返回

在服务器上创建数据的api接口(json格式)

在tomcat服务器上创建数据的api接口(json格式)

简介:
即把数据传到服务器,以后需要使用数据,就直接用HttpURLConnection的相关类进行调用就好了。

效果图:
输入url地址,得到相关数据

%title插图%num

api接口创建的步骤
1.新建一个json文件夹。创建一个json格式的文件
2.将json格式的文件放入webapps的ROOT文件下。
3.启动tomcat的bin目录下点击startup.bat(Window系统下。如果是linux,点击startuo.sh)来启动服务器。
4.输入localhost:8080\NewsInfo.json,即可查看数据的json的格式。

我的服务器API接口文档

API接口文档
一:域名
https://xxx.com
二:请求方式 get/post

三:api前缀:/api

四:接口路径:

1:/banner (获取首页轮播图)
@parame:无参数
@method: get/post

2:/nav (获取首页菜单)
@parame:无参数
@method:get/post

3:/get_good (获取首页商品推荐)
@parame: add string 首页位置
@method: post

4: /get_good_class (获取商品分类)
@parame:无参数
@method: get

5:/get_good_box (获取商品货柜)
@parame : 无参数
@method : get

6:/get_good_box_id (获取货柜中对应的商品数据)
@parame:box_id string 货柜id
@method: post

7:/get_good_detail (获取商品详情数据)
@parame:good_id string 商品id
@method:post

8:/get_good_class_detail (获取某一商品分类下的所有商品)
@parame:class_id string 商品分类id
@method:post

9:/getOpenId (获取用户getOpenId)
@parame:code string 小程序wx.login()登录时获取的code
@method:post

10:/updateWechat (更新用户微信信息)
@parame:
nickName string 用户名
avatarUrl string 头像
Openid string openid
@method:post

11:/good_box_kai (打开货柜柜门)
@parame: box_id string 货柜id
@method:post

12:/good_box_normal_status_guanbi (关闭货柜柜门)
@parame: box_id string 货柜id
@method:post

13:/add_good_collect (添加收藏商品)
@parame:
User_id string 用户id
good_id string 商品id
@method:post

14:/delete_good_collect (取消收藏商品)
@parame:
User_id string 用户id
good_id string 商品id
@method:post

15:/add_good_cart (添加购物车)
@parame:
User_id string 用户id
good_id string 商品id
good_num number 商品数量
good_price number 商品价格
@method:post

16:/delete_good_cart (删除购物车)
@parame:
Cart_id string 购物车id
@method:post

17:/get_good_cart (获取购物车数据)
@parame:user_id string 用户id
@method:post

18:/get_index_good_cart (获取购物车详情数据)
@parame: user_id string 用户id
cartId string 购物车id
@method:post

19:/upload_good_cart_num (修改购物车数据)
@parame:
cartNum number 数量
cartId string 购物车id
user_id string 用户id
@method:post

20:/getUserOrder (获取用户订单)
@parame: user_id string 用户id
@method:post

21:/getOrderDetail (获取用户订单详情数据)
@parame: order_id string 订单id
@method:post

22:/get_user_info (获取用户基本信息)
@parame:
User_id string 用户id
@method:post
23:/create_address (添加用户收货地址)
@parame:
user_name string 姓名
user_phone string 电话
user_id string 用户id
@method:post

24:/get_address (获取用户地址)
@parame: user_id string 用户id
@method:post

25:/get_index_address (获取地址详情)
@parame: user_id string 用户id
address_id string 地址id
@method:post

26:/delete_address (删除地址)
@parame: user_id string 用户id
address_id string 地址id
@method:post

27:/userSign (用户签到)
@parame: user_id string 用户id
@method:post

28:/getUserSign (获取用户签到信息记录)
@parame: user_id string 用户id
@method:post

29:/getUserPoint (用户积分)
@parame: user_id string 用户id
@method:post

30:/mobileRegister (更新用户手机号)
@parame: user_id string 用户id
session_key string 微信自动返回的session_key
@method:post

31:/preprocessOrder (支付)
@parame: user_id string 用户id
good string 商品id
amount string 金额
address string 地址id
@method:post

32:/wxNotify (微信支付的回调地址)
@parame:微信回调的请求参数
@method:post

五:请求数据返回格式:json

六:数据状态
Status:
2 表示成功
1 表示失败
其他表示异常,会有提示自动返回

什么是API接口,具体是什么意思?

说到API,往往是和SDK放在一起的。什么叫API,看一下餐厅里怎么点餐的就行了。
1
到了饭店,喊一场服务员,点餐。服务员拿出来菜单给你看,你点什么,她在小本本上记什么。点好了之后,再把菜单送到后厨去。这里服务员就是提供服务的(不然也不叫服务员),提供什么服务呢?点餐服务。
点餐服务需要什么呢?谈一个服务,通常就是要谈输入是什么,输出又是什么。从眼下这个例子来看,输入就是一道道菜品的名字(或者是ID,不知道你们见过菜品上面有编号,服务员只记编号的?),输出的结果就是端过来的一道道菜。有了输入和输出,服务员就可以提供了点餐的功能,这就是API,顾客就是调用者,服务员就是服务的提供者。
你可以在这里把服务员替换成猫猫,假设女王大人猫猫来给你提供服务,只要输出是菜品的名字,输出是菜品,这个API就是能够正常使用的。而且,所有的顾客都可以用这种方式来点菜 的再想想 ,是不是有的服务员手里拿的是点餐机? 想想一个漂亮的小姑娘,拿着一个和手机大小差不多的点餐机,这个点餐机,就是需要和后厨删除线格式 系统有交互,这种交互,就需要一种约束,来声明点菜功能的输入是什么,输出是什么。比如说,如果用户点了一道已经估清的菜,是不是服务员要告诉顾客一下?
API通常是以Http的形式提供,它隐藏的含义就是,只要你符合我定义的标准,你就

可以来使用我。比如说,服务员是中国姑娘,顾客是美国人,没关系,只要美国人能说中国话,这套API就可以使用。如果美国人只会说英语,怎么办?让和美国人一起来吃饭的中国朋友翻译成中文,就可以了~~~~
那么什么是SDK呢?当美国人不会说中文的时候,饭店里的大堂经理来了,他来给美国佬当翻译。这就是SDK,SDK一般都是和语言相关,是官方提供的各种不同语言的实现版本。同样的,我们再把思维模式扩大一点。除了Http这种API,内部系统集成的组件,是否也是有API?你会发现,确实是这样的,比如说,JDK本身提供的各种API,在这里,API和SDK的概念没有那么清楚了,但是API本身的含义就是,当服务的提供方对外提供服务的时候,应该声明输入和输出和功能的明确含义。而一组组明确声明了的输入,输出和功能描述,就是服务方提供的各种API。比如说数组对外暴露的方法,链表对外暴露的方法等等。那么,API和方法之间有没有明显的区别呢?暴露出去的,可被公开使用的方法,统称为API~~~以上解释不够严谨,但是对于初学者来说,理解起来应该够了。如果你在理解API的时候有困难,大概问题并不是在API上,而是你有没有理解清楚什么叫做封装,什么叫做服务?

什么是接口服务器

接口服务器:与第三方系统接口, 但是原理是什么,上面安装何种程序,与应用服务器和数据库服务器关系?

%title插图%num

接口服务器,我是这么理解的:
假设系统A,这个系统A必须与另外一个单位的系统B做数据交互。但是两个系统的数据库结构甚至数据库软件都不一样,这个时候就必须做一个数据接口来进行两个系统的数据互导。
比如说在某种触发条件下,把系统A数据库表格1第二个字段里的数据,导入到系统B数据库表格2第三个字段中。
以上工作就交给接口服务器来做,既可以防止双方数据库服务器直接互联造成的数据外泄风险,也可以减少双方数据库服务器的负担。
至于接口服务器上装什么软件,一般是数据库(ORACLE、MYSQL等等)和数据接口程序。

服务器分几种

服务器分几种
服务器英文名称为“Server”,指的是网络环境下为客户机(Client)提供某种服务的专用计算机,服务器安装有网络操作系统(如Windows 2000 Server、Linux、Unix等)和各种服务器应用系统软件(如Web服务、电子邮件服务)的计算机。这里的“客户机”指安装有DOS、Windows 9x等普通用户使用的操作系统的计算机。
服务器的处理速度和系统可靠性都要比普通PC要高得多,因为服务器是在网络中一般是连续不断工作的。普通PC死机了大不了重启,数据的丢失损失也仅限于单台电脑。服务器则完全不同,许多重要的数据都保存在服务器上,许多网络服务都在服务器上运行,一旦服务器发生故障,将会丢失大量的数据,造成的损失是难以估计的,而且服务器提供的功能如代理上网、安全验证、电子邮件服务等都将失效,从而造成网络的瘫痪,对服务器可靠性的要求可见一斑。
服务器的种类
按照不同的分类标准,服务器分为许多种,主要有按网络规模、按架构(芯片)、按用途、按外观
1、按网络规模划分
按网络规模划分,服务器分为工作组级服务器、部门级服务器、企业级服务器。
工作组级服务器
用于联网计算机在几十台左右或者对处理速度和系统可靠性要求不高的小型网络,其硬件配置相对比较低,可靠性不是很高。
部门级服务器
用于联网计算机在百台左右、对处理速度和系统可靠性中等的中型网络,其硬件配置相对较高,其可靠性居于中等水平。
企业级服务器
用于联网计算机在数百台以上、对处理速度和数据安全要求*高的大型网络,硬件配置*高,系统可靠性要求*高。
需要注意的是,这三种服务器之间的界限并不是*对的,而是比较模糊的,比如工作组级服务器和部门级服务器的区别就不是太明显,有的干脆统称为“工作组/部门级”服务器。
2、按架构划分(芯片)
按照服务器的结构,可以分为CISC(复杂指令集)架构的服务器和RISC(精简指令集)架构的服务器:
IA架构服务器(Intel Architecture Server)-即通常所讲的PC服务器,采用x86(CISC)芯片并且主要采用Windows NT/Windows2000、Linux、FreeBSD等操作系统的服务器,如Intel PentiumIII(P4)和Intel (P4)Xeon(至强)等。
RISC架构的服务器指采用非英特尔架构技术的服务器,使用RISC芯片并且主要采用UNIX操作系统的服务器,如SUN公司的SPARC、HP公司的PA-RISC、DEC的Alpha芯片、SGI公司的MIPS等;
由于RISC架构服务器的性能和价格比CISC架构的服务器高得多。近几年来,随着PC技术的迅速发展,IA架构服务器与RISC架构的服务器之间的技术差距已经大大缩小,用户基本上倾向于选择IA架构服务器,但是RISC架构服务器在大型、关键的应用领域中仍然居于非常重要的地位。
3、按用途划分
按照使用的用途,服务器又可以分为通用型服务器和专用型(或称“功能型”)服务器,如实达的沧海系列功能服务器。
通用型服务器是没有为某种特殊服务专门设计的可以提供各种服务功能的服务器,当前大多数服务器是通用型服务器。
专用型(或称“功能型”)服务器是专门为某一种或某几种功能专门设计的服务器,在某些方面具有与通用型服务器有所不同。如光盘镜像服务器是用来存放光盘镜像的,那么需要配备大容量、高速的硬盘以及光盘镜像软件。
4、按外观划分
按照服务器的外观,可以分为台式服务器和机架式服务器以及刀片服务器
1.台式服务器有的采用大小与立式PC台式机大致相当的机箱,有的采用大容量的机箱,像一个硕大的柜子一样,主要分为单塔式和双塔式,
2.机架式服务器的外形看起来不像计算机,而是像交换机,有1U(1U=1.75英寸)、2U、4U等规格,如下图所示。机架式服务器安装在标准的19英寸机柜里面。
刀片服务器
刀片服务器是一种称之为“HAHD(High Availability High Density,高可用高密度)”的低成本服务器平台,是专门为特殊应用行业和高密度计算机环境设计的。在结构上它比前面介绍的机架式服务器更紧凑,因为它像刀片一样非常薄,而且可以根据需要选择是否插入整个服务器系统的机柜中,所以称之为“刀片服务器”,如下图。主要应用集群服务。
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速