Session 与CURL和browser不同的服务器行为

Session 与CURL和browser不同的服务器行为,session,curl,dart,Session,Curl,Dart,当我使用CURL和从浏览器执行登录请求时,我的服务器表现不同 执行以下curl请求时: curl -i -X POST 'http://localhost:8080/login' -d 'username=fred&password=blah' -H 'content-type: application/x-www-form-urlencoded' 我以以下形式获得预期结果: 但是,当从浏览器窗体执行相同(或者我认为是这样)的请求时,我会在浏览器调试器中看到以下结果 用于发出请

当我使用CURL和从浏览器执行登录请求时,我的服务器表现不同

执行以下curl请求时:

 curl -i -X POST 'http://localhost:8080/login' -d 'username=fred&password=blah' -H 'content-type: application/x-www-form-urlencoded'
我以以下形式获得预期结果:

但是,当从浏览器窗体执行相同(或者我认为是这样)的请求时,我会在浏览器调试器中看到以下结果

用于发出请求的表单代码如下所示

        <form action="localhost:8080/login" method="POST">
          <input type="text" name="username" placeholder="Username">
          <input type="text" name="password" placeholder="Password">
          <input type="submit" id="sign_in" value="Sign In">
        </form>
相关dart代码:

  /* Login box */
  login_form = querySelector('#login_form');
  login_form.onSubmit.listen(submitLogin);

当将CURL与原始请求(有效)和上面代码完成的请求进行比较时,我注意到
内容类型
是不同的。 我试图以我所知道的每一种方式强制执行内容类型,但它总是像这样出现

curl "http://localhost:8080/login" -H "Origin: http://localhost:8080" -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4" -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.0 (Dart) Safari/537.36" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZ1seZo8pq0PZt3Fg" -H "Accept: */*" -H "Referer: http://localhost:8080/" -H "Connection: keep-alive" --data-binary "------WebKitFormBoundaryZ1seZo8pq0PZt3Fg"^
"Content-Disposition: form-data; name=""username"""^

"fred"^
"------WebKitFormBoundaryZ1seZo8pq0PZt3Fg"^
"Content-Disposition: form-data; name=""password"""^

"blah"^
"------WebKitFormBoundaryZ1seZo8pq0PZt3Fg--"^
"" --compressed
而不是

curl "http://localhost:8080/login" -H "Origin: http://localhost:8080" -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4" -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.0 (Dart) Safari/537.36" -H "Content-Type: application/x-www-form-urlencoded" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "Cache-Control: max-age=0" -H "Referer: http://localhost:8080/" -H "Connection: keep-alive" --data "username=fred&password=blah" --compressed

操作
属性中的URL是相对的,这意味着它被附加到当前主机名。因此,如果您已经在
localhost:8080
上,可以通过添加
http://
或将其更改为
/login
将其更改为绝对URL。此答案与问题的第二部分有关(请参见编辑)。我在文档中的任何地方都找不到现成的示例代码。这就是为什么我添加下面的工作代码作为答案。如果你找到一种更优雅的方式从表格中获取数据,请在这篇文章下面写一条评论

HTML部分

  <form id="login_form" action="/login" method="POST" enctype="application/x-www-form-urlencoded">
    <input type="text" name="username" placeholder="Username">
    <input type="text" name="password" placeholder="Password">
    <input type="submit" id="sign_in" value="Sign In">
  </form>
事件处理程序

/* Login code */
void submitLogin(Event e){
  e.preventDefault();

  FormElement form = e.target as FormElement;
  print('inside of submitLogin');

  Uri loginUri = new Uri(scheme: 'http',
      host: 'localhost',
      port: 8080,
      path: 'login');
  InputElement username = querySelector('[name="username"]');
  InputElement password = querySelector('[name="password"]');
  Map dataFromForm = {'username':username.value.toString(),'password':password.value.toString()};
  print(loginUri);
  HttpRequest.postFormData(loginUri.toString(), dataFromForm)
  .then(onDataLoaded);
}

void onDataLoaded(HttpRequest req){
  String response = req.responseText;
  print(response);
  //TODO: do visual

你收到错误信息了吗?我从截图上看不到一个。截图应该告诉我什么?我认为,如果要支持CORS请求,您还需要允许请求类型
选项
POST
以及
来源
。请尝试将操作更改为“登录”、“登录”或“”。您可能希望执行HttpRequest而不是发布表单,因为发布表单会导致页面重新加载,而这通常不是您在单页Dart应用程序中想要的。Chrome developer console->netowrk选项卡,右键单击POST request并选择“Copy as cURL”可能您发现了其中的差异,如果不在这里发布,可能会比截图更好谢谢,@Robert“/登录”解决方案很有效。如果你想,你可以加上它作为答案,我会接受的。看起来不错。也许您可以使用
form.querySelector()
来获取输入。
  <form id="login_form" action="/login" method="POST" enctype="application/x-www-form-urlencoded">
    <input type="text" name="username" placeholder="Username">
    <input type="text" name="password" placeholder="Password">
    <input type="submit" id="sign_in" value="Sign In">
  </form>
login_form = querySelector('#login_form');
login_form.onSubmit.listen(submitLogin);
/* Login code */
void submitLogin(Event e){
  e.preventDefault();

  FormElement form = e.target as FormElement;
  print('inside of submitLogin');

  Uri loginUri = new Uri(scheme: 'http',
      host: 'localhost',
      port: 8080,
      path: 'login');
  InputElement username = querySelector('[name="username"]');
  InputElement password = querySelector('[name="password"]');
  Map dataFromForm = {'username':username.value.toString(),'password':password.value.toString()};
  print(loginUri);
  HttpRequest.postFormData(loginUri.toString(), dataFromForm)
  .then(onDataLoaded);
}

void onDataLoaded(HttpRequest req){
  String response = req.responseText;
  print(response);
  //TODO: do visual