我对那些在编程中有关于无状态和有状态设计的具体信息的文章很感兴趣.我很感兴趣,因为我想了解更多,但我真的找不到任何关于它的好文章.我已经阅读了几十篇关于网络的文章,这些文章模糊地讨论了这个主题,或者他们谈论的是网络服务器和会话 - 这也是'有状态与无国籍的关系,但我对无状态与编码属性的有状态设计感兴趣.示例:我听说BL-classes在设计上是无状态的,实体类(或者至少我称之为Person(id,name,..))是有状态的等等.
我认为重要的是要知道,因为我相信如果我能理解它,我可以编写更好的代码(例如粒度).
无论如何,真的很短,这就是我所知道的'有状态对无国籍:
有状态(如WinForms):存储数据以供进一步使用,但限制了应用程序的可伸缩性,因为它受CPU或内存限制的限制
无状态(与ASP.NET一样 - 尽管ASP尝试使用ViewStates保持状态):操作完成后,数据将被传输,实例将被传回线程池(Amorphous).
正如您所看到的,它是非常模糊和有限的信息(并且非常关注服务器交互),所以如果您能为我提供更多美味的信息,我将非常感激:)
我想这个问题听起来很熟悉,但我还是另一个被REST困惑的程序员.
我有一个传统的Web应用程序,从StateA到StateB等等.如果用户去了StateB的(URL),我想确保他之前访问过StateA.传统上,我使用会话状态执行此操作.
由于REST中不允许会话状态,我该如何实现?
在阅读了关于REST的介绍性文章(Fielding的论文和其他)后,我对无状态的看法是服务器端不应该有会话对象.然而,我看到Flask(以及我不知道的不同技术中的其他REST框架)为我们提供了一个会话对象,用于在此示例中在服务器上存储信息:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
...
Run Code Online (Sandbox Code Playgroud)
当然,我误解了REST的无国籍状态.那么,它真的是什么?
我见过这个建议......
理想情况下,Web应遵循REST原则并完全无状态.因此,单个URL应标识单个资源,而不必保留每个用户的导航历史记录.
...我读了维基百科页面http://en.wikipedia.org/wiki/REST,这听起来不错,但我不知道如何实际实现它.我在ASP .NET Webforms NOT MVC工作.
例如,在我即将构建的应用程序中 - 我需要我的用户登录才允许他们做任何事情.在他们被允许做很多有用之前,他们必须跳过几个箍 - 比如接受T和C并确认他们的基本细节不变.最后他们被允许做他们真正想要的东西,比如BuyAProduct!
在我看来(我来自Rich客户端的HEAVILY有状态世界),我需要状态来记录他们所做的事情并从中推断他们可以做什么.我不知道如何支持他们(比如)为BuyAProduct URI添加书签.当他们到达书签时,我如何知道他们是否已登录,以及他们是否同意T和C以及他们是否尽职尽责地检查了他们的基本细节?
我喜欢应用程序无状态的想法,部分原因是它似乎完全解决了"当用户点击后退和前进按钮时,我该怎么办?" 我看不出我怎么能让它正常工作.我觉得我错过了一些非常基本的东西.
我正在为移动应用设计一个API,我希望保持RESTful.
API是使用Basic HTTP Auth授权的,但是,当用户第一次打开应用程序时,他需要先登录,所以我需要设计一个API来检查用户的凭据,这将接受一对用户名和密码,相应地返回成功或失败.
问题是网址应该是什么,所以它是宁静的?我认为/ login不是一个好的.
可以使用REST架构约束实现购物车吗?
我想集中关于会话状态的问题.在实现购物车的典型MVC应用程序中,最有可能的是,会话对象将在会话中被管理,购物车将作为产品列表来管理.
如果应用程序遵循REST架构,那么如何管理同一个购物车.REST约束之一是状态管理是客户的责任.
购物车及其进度是否应由客户管理?任何例子?在简单的购物车或任何其他企业应用程序中管理客户端状态的任何缺点?
我正在使用web api控制器创建一个Web服务.我希望能够创建会话并检查会话的状态.我有以下内容:
控制器:
public string Get(string user, string pass)
{
bool loginValue = false;
loginValue = UserNamepassword(user, pass);
if (loginValue == true)
{
HttpContext.Current.Session.Add("Username", user);
//session["Username"] = user;
//session.Add("Username", user);
if ((string)HttpContext.Current.Session["Username"] != null)
{
HttpContext.Current.Session.Add("Time", DateTime.Now);
return "Username: " + (string)HttpContext.Current.Session["Time"] + (string)HttpContext.Current.Session["Username"];
}
return "Logged in but session is not availabe for " + (string)HttpContext.Current.Session["Username"];
}
else
return "Login failed for " + user;
}
Run Code Online (Sandbox Code Playgroud)
WebConfig
public static void RegisterRoutes(RouteCollection routes)
{
var route = routes.MapHttpRoute(
name: "SessionApi", …Run Code Online (Sandbox Code Playgroud) 我正在尝试让我的会话为 API-Routes 工作。在 Web-Routes 上一切都很好,但是当我尝试在 API-Routes 上使用它时,会话是空的。
我知道 API 应该是无状态的,但我只是与外部 API 通信,而我的 Laravel 实例只是前端。
所以我的身份验证只是Session::put('userData', $response->data);在成功请求 API 的登录端点之后的一个简单操作。其中有一些关于姓名、电子邮件、一些默认数据和用户的身份验证令牌的数据。
最后一个很重要,因为我想通过 AJAX (axios) 访问一些端点,并且我需要将保存的身份验证令牌发送到 API 以使事情正常工作。但是在我尝试用我的RedirectIfUnauthenticated-Middleware保护 API-Routes 的那一刻,一切都被打破了。它总是将我重定向到登录页面,因为会话是空的。
如果我删除它,我会到达控制器,但会话仍然是空的,我无法将身份验证令牌添加到 api 请求。
我想我在这里做了一些根本错误的事情。所以也许有人可以在这里提供帮助。
我已经尝试添加\Illuminate\Session\Middleware\StartSession::class,到$middlewareGroupsapi 部分,但它似乎重置了所有会话数据,因此我被注销了。但也许我在这里也做错了。