用newLisp开发网站四 REST API

本文介绍如何利用newLisp开发网站,重点讲解REST API的实现。通过URL中的$resource与lisp文件名对应,结合Route.Resource进行RESTful routing。内容包括从Resource context继承,用FOOP处理REST请求,并详细阐述了action、id和format在REST API中的作用。示例中展示了如何处理GET请求,以及获取和返回参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL中的$resource和lisp文件名对应

本节主要学习如何使用第二种路由方法来实现REST API。仍然阅读http://dragonfly.neocortex.io/dragonfly_routes

不过要看这一节:

RESTful routing with Route.Resource


首先是URL请求格式有讲究,

http://mysite.com/$resource[/action][/id][.format][?get params..]

$resource

$resource是个变量必须和放在resources目录下的lsp文件名相同,比如有一个wings.lsp文件,这里的url路径就应该从wings开始

比如

http://mysite.com/wings

如果找不到对应的文件,则会显示404错误,文档太老了,还在说500错误。


用FOOP处理REST请求

从Resource context继承

以wings.lsp为例,它必须从Resource继承出自己的,而且有书写格式要求,比如:

(DF:activate-plugin "artfulcode/json")
(new Resource 'Resource.Wings)
(context 'Resource.Wings)

第一行是必须的,照抄即可。第二行注意命名,Wings要写成首字母大写,无下划线,并且用Resource. 作为前缀

第三行切换到Resource.Wings context.

这里涉及到context和FOOP的概念,参考我的另外几篇文章。

所有这里$resource不仅映射到文件(wings.lsp),也映射到文件内部的FOOP对象。

action

action映射到该FOOP对象的某个函数。如果URL请求中没有指定action,则会调用默认构造函数。注意,action是大小写敏感的,下面是例子:

(define (Resource.Mailer:send)
  (println "action: "))

对应的urlg调用路径是:

http://localhost:8089/mailer/send


下面创建一个class的构造函数(也就是context的默认函数)用来处理没有action的REST 请求,REST 请求发过来后会调用它。

(define (Resource.Wings:Resource.Wings id response-format)
	; defaults to calling show
	(show id response-format)
)


id和format

这个函数接受两个参数,对应了URL中的id和format参数。当然可以不处理这两个参数,因此他们是可选的。
运行一下例子,可以看到,当发出HTTP请求如下:

http://localhost:8080/wings/1.json
会得到结果如下:

["wings-condition", ["good", "excellent"]]

一个重要的提示,dragonfly没有设计成区分HTTP METHOD,设计者认为这不是个好主意,会带来很多的问题。所以不管什么HTTP方法的请求,都会调用到wings.lsp的中的默认构造函数。

下面用newlisp发起调用

get请求

> (get-url "http://localhost:8080/wings/1.json")
"[\"wings-condition\", [\"good\", \"excellent\"]]"
post请求

> (post-url "http://localhost:8080/wings/1.json" "a=1" "application/x-www-form-urlencoded")
"[\"wings-condition\", [\"good\", \"excellent\"]]"
因此,如果觉得数据传递需要保密,或者很长,可以用post请求,一般get请求即可。

dragonfly推荐使用action来表达请求的意图,如下,的确是个很好的设计。


resouce是photos

action的可选值是: 无,new, create, show, edit, update, destroy

这里是举例,不是固定的。比如在我的一个一个应用中,action的值是: 无,save(create or update), show, build, destroy

id是可选的, 一般用于定位到复数中的某个对象

format没有

参数自己随意吧


返回结果
如何返回数据给调用者?直接用print函数


如何获得参数

用($POST key)或者($GET key),比如:

(print ($POST "a"))

参考文档: http://dragonfly.neocortex.io/dragonfly_getpost








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值