我正在寻找一种方法来在我的基于PHP的Web应用程序,数据库和CMS中围绕默认函数包装API.
我环顾四周,发现了几个"骨架"框架.除了我的问题的答案,还有Tonic,我喜欢的REST框架,因为它非常轻量级.
我最喜欢REST,因为它简单,并且希望基于它创建一个API架构.我试图了解基本原则并且还没有完全理解它.因此,一些问题.
我理解对吗?
假设我有一个资源"用户".我可以像这样设置一些URI:
/api/users when called with GET, lists users
/api/users when called with POST, creates user record
/api/users/1 when called with GET, shows user record
when called with PUT, updates user record
when called with DELETE, deletes user record
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是RESTful架构的正确表示吗?
我需要更多的动词
理论上创建,更新和删除可能就足够了,但在实践中我需要更多的动词.我意识到这些内容可以嵌入到更新请求中,但它们是具有特定返回代码的特定操作,我不想将它们全部放入一个操作中.
用户示例中的一些想法是:
activate_login
deactivate_login
change_password
add_credit
Run Code Online (Sandbox Code Playgroud)
我将如何表达RESTful URL架构中的操作?
我的直觉是对像这样的URL进行GET调用
/api/users/1/activate_login
Run Code Online (Sandbox Code Playgroud)
并期望返回状态代码.
但是,这偏离了使用HTTP动词的想法.你怎么看?
3.如何返回错误消息和代码
REST的美丽很大一部分源于其使用标准HTTP方法.如果出错,我会发出一个包含3xx,4xx或5xx错误状态代码的标头.对于详细的错误描述,我可以使用正文(对吗?).到现在为止还挺好.但是,传输专有错误代码的方法是什么,该错误代码在描述错误时更详细(例如"无法连接到数据库"或"数据库登录错误")?如果我把它和信息一起放入体内,我必须在事后解析它.这种东西有标准的标题吗?
4.如何进行身份验证
我相信Java的URI.resolve方法的定义和实现与RFC 3986第5.2.2节不兼容.我知道Java API定义了该方法的工作方式,如果它现在被更改,它会破坏现有的应用程序,但我的问题是:任何人都可以确认我的理解这个方法与RFC 3986不兼容吗?
我正在使用这个问题中的示例:java.net.URI仅针对查询字符串进行解析,我将在此处复制:
我正在尝试使用JDK java.net.URI构建URI.我想附加一个绝对URI对象,一个查询(在String中).例如:
URI base = new URI("http://example.com/something/more/long");
String queryString = "query=http://local:282/rand&action=aaaa";
URI query = new URI(null, null, null, queryString, null);
URI result = base.resolve(query);
Run Code Online (Sandbox Code Playgroud)
理论(或我认为)是决心应该回归:
http://example.com/something/more/long?query=http://local:282/rand&action=aaaa
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
http://example.com/something/more/?query=http://local:282/rand&action=aaaa
Run Code Online (Sandbox Code Playgroud)
我对RFC 3986第5.2.2节的理解是,如果相对URI的路径为空,那么将使用基URI的整个路径:
if (R.path == "") then
T.path = Base.path;
if defined(R.query) then
T.query = R.query;
else
T.query = Base.query;
endif;
Run Code Online (Sandbox Code Playgroud)
并且仅当指定了路径时才是要与基本路径合并的相对路径:
else
if (R.path starts-with "/") then
T.path = remove_dot_segments(R.path);
else
T.path = merge(Base.path, R.path);
T.path = remove_dot_segments(T.path);
endif; …Run Code Online (Sandbox Code Playgroud) 简短的问题是 - 什么是最佳实践 - 在URL中使用或不使用尾部斜杠.
但是,它们似乎都处理静态目录结构.那些动态网址,比如重写的网页,或者由中央设施(例如网页框架)处理的动态网址,根据约定/配置转发到内部资源.对于他们来说,Web服务器实际上不再搜索并确定确切的位置 - 这只是解析的问题.
因此,例如使用spring mvc,您声明在URI匹配时调用给定的类方法/service/action/{pathParam}- 对于此URL,imo,使用尾部斜杠没有意义 - 请求每次都由同一个servlet处理,解析.
我认为一个人应该保持一致 - 要么在任何地方使用尾随斜杠,要么根本不使用它们.
所以:
当我输入/login网址时,它会出错
例如:
from flask import Flask ,url_for,render_template,request
app = Flask(__name__)
@app.route('/login')
def index():
return "index"
if __name__== "__main__":
app.run()
Run Code Online (Sandbox Code Playgroud)
错误结果是这样的:
Not Found.
The requested URL was not found on the server.
Run Code Online (Sandbox Code Playgroud)
当我/login用/login/或替换任何其他单词时/log,它会没事的.这是怎么发生的?
我正在开发一个新项目,使用Apache的mod_rewrite和PHP来获取漂亮的URL.
这是我的网址的样子:
http://example.tld/foo/bar/1/etc
请注意,没有尾部斜杠(这是我在s 的href属性中写入的方式<a>).
但是,我也允许http://example.tld/foo/bar/1/etc/(尾随斜线).
这是不好的做法吗?我想知道,如果只允许一种方式或者如果我最好在我的所有链接中使用尾部斜杠,默认情况下是否会更好.
谢谢.
什么不起作用:如果我创建一个链接(例如,打开domain.tld/main),href="#"我得到的链接显示为,domain.tld/main#而不是我想要的那样domain.tld/main/#.我想要一致性,因为它显示在我的索引页面上,没有url子目录domain.tld/#.
组态:
urls.py
urlpatterns = [
url(r'^$', views.UserLogin),
url(r'^logout$', 'django.contrib.auth.views.logout', {'next_page':'/'}),
url(r'^main$', views.Main),
]
Run Code Online (Sandbox Code Playgroud)
views.py
def Main(request):
if not request.user.is_authenticated():
return HttpResponseRedirect("http://www.domain.tld")
else:
return render(request, "main")
Run Code Online (Sandbox Code Playgroud) url ×3
uri ×2
apache ×1
django ×1
django-views ×1
flask ×1
java ×1
mod-rewrite ×1
php ×1
python ×1
query-string ×1
regex ×1
relative-url ×1
rest ×1
rfc3986 ×1
seo ×1
web-services ×1