我需要通过Jolie服务的操作向浏览器设置Cookie,但找不到有关如何执行操作的信息。
我检查了https://jolielang.gitbook.io/docs/protocols/http和https://jolielang.gitbook.io/docs/web-applications/rest-apis-publication-and-integration处的文档,但似乎我介绍的用例尚未涉及。
inputPort MyIP {
Protocol: http {
...
??? -> myCookie;
...
}
Interfaces: LoginInterface
}
main {
[login(credentials)(res) {
...
myCookie=???
...
}]
}
我希望在浏览器cookie存储区中看到该cookie。
答案 0 :(得分:1)
您在正确的轨道上。Cookie的设置是通过使用MDN Reference所示的返回标题信息来进行的。
要在Jolie中操作响应头,您需要在http端口配置的.addHeader节点上进行操作 这是我的代码
interface MyInterface {
RequestResponse:
login(undefined)(undefined)
}
inputPort MyPort {
Location: "socket://localhost:8000"
Protocol: http {
.debug= true;
.debug.showContent= true;
.addHeader.header[0] = "Set-Cookie";
.addHeader.header[0].value->cookieCommand
}
Interfaces: MyInterface
}
execution{ concurrent }
main{
[login(request)(response){
//doing something to control my credatiol
cookieCommand = "yummy_cookie=myCookieValue "
}]
}
您如何阅读此代码
.addHeader.header[0] = "Set-Cookie";
.addHeader.header[0].value->cookieCommand
此部分在响应标头中添加“ Set-Cookie”标头,该标头将具有变量cookieCommand作为值;符号->是structure alias
现在您可以在我的示例中的任何操作行为中都可以在登录操作
中设置变量cookieCommand。 [login(request)(response){
//doing something to control my credatiol
cookieCommand = "yummy_cookie=myCookieValue "
}]
下图显示了通话结果
这是浏览器上的结果
现在让我们看看如何处理传入的cookie。首先,我们可以定义一个新操作op1
interface MyInterface {
RequestResponse:
login(undefined)(undefined),
op1(op1RequestType)(op1ResponseType)
}
在请求类型中,我们需要添加一个新节点,其中将包含我们的应用程序cookie值
type op1RequestType:void{
.cookieValue:string
}
然后,我们需要设置Http inputPort接收到的cookie值与操作输入变量之间的匹配
inputPort MyPort {
Location: "socket://localhost:8000"
Protocol: http {
.debug= true;
.debug.showContent= true;
.addHeader.header[0] = "Set-Cookie";
.addHeader.header[0].value->cookieCommand;
.osc.op1.cookies.yummy_cookie = "cookieValue"
}
Interfaces: MyInterface
}
端口配置参数
.osc.op1.cookies.yummy_cookie = "cookieValue"
读作osc。(nameOperation).cookies.nameCookie = nameNodeInTheType
让我们看看来自浏览器的呼叫
和操作中的跟踪( jolie --trace )
希望有帮助
答案 1 :(得分:1)
您可以使用cookies
参数,该参数将cookie名称映射到消息中存在的字段。
例如,.cookies.auth_token = "token"
将名为auth_token
的cookie绑定到消息中的字段token
(包括读写)。
这是一个完整的示例,其中login
操作在浏览器中设置cookie auth_token
。
execution { concurrent }
inputPort Server {
Location: "socket://localhost:8080"
Protocol: http
// Binds the cookie "auth_token" to the message field "token"
{ .cookies.auth_token = "token" }
RequestResponse: login
}
main
{
login( request )( response ) {
if ( request.pwd == "secret" )
response << "OK" { .token = new }
else
response << "Invalid pwd" { .token = "" }
}
}
您可以通过浏览http://localhost:8080/login?pwd=secret来尝试。
使用这样的cookie可以将它们与工作流结合起来,以对process-aware web applications进行编程。这是带有以下工作流程的更详细的示例:
say
,直到调用操作logout
为止。我正在使用下面的相关集来跟踪会话。
include "console.iol"
execution { concurrent }
type LoginRequest:void { .token?:string .pwd:string }
type TokenMessage:void { .token:string }
type SayRequest:void { .token:string .msg:string }
interface ServerIface {
RequestResponse:
login(LoginRequest)(TokenMessage) throws InvalidPwd,
say(SayRequest)(void),
logout(TokenMessage)(TokenMessage)
}
inputPort Server {
Location: "socket://localhost:8080"
Protocol: http { .cookies.auth_token = "token" }
Interfaces: ServerIface
}
cset {
token: SayRequest.token TokenMessage.token
}
main
{
login( request )( response ) {
if ( request.pwd == "secret" )
response.token = csets.token = new
else
throw( InvalidPwd )
};
provide
[ say( request )() {
println@Console( csets.token + " says " + request.msg )()
} ]
until
[ logout()( response ) { response.token = "" } ]
}
要尝试,您可以依次浏览以下链接:
参考文献: