【问题标题】:Read POST data in AJAX call在 AJAX 调用中读取 POST 数据
【发布时间】:2017-01-26 17:41:01
【问题描述】:

我有一些 Session 值,我通过 Ajax 调用不断更改它们。我似乎无法处理 POST 数据来处理它并设置值。

我在这里传递给它的是一个字符串数组,如下面的代码所示。

这里是 AJAX 调用的地方:

var sessionValues = [];
str = {"PID": "1", "Level": "Main", "MenuName": "Kitchen", "State": "CHECKED"}
sessionValues.push(str);
var postObj = {"sessionData": sessionValues};

 $.ajax({
  type: 'POST',
  data: {'data': postObj},
  url: 'setSession.asp'
 }).done(function(response){
 console.log(response);
})

我在 PHP 版本的程序中可以正常工作,但我的 ASP 版本没有抓取数据。这是我的 PHP 版本和 ASP 版本,尽我所能转换。

<-- php setSession.php works fine -->
$data = $_POST['data'];
foreach ($data['sessionData'] as $key => $value) {
 $projectProduct = "1";
 $level = $value["Level"];
 $menuName = $value["MenuName"];
 $state = $value["State"];
 $_SESSION['PID:'.$projectProduct][$level][$menuName]['menu_state'] = $state;
 echo "[PID:".$projectProduct."][".$level."][".$menuName."][".$state."]<br>";
}
0 =>>>>> Array<br>[PID:1][Main][Kitchen][CHECKED]

这里我想在 ASP 中做同样的事情

' setSession.asp 
data = Request.Form("data")
For Each part In data("sessionData")
 projectProduct = part("PID")
 level = part("Level")
 menuName = part("MenuName")
 state = part("State")
 Session("PID:" & projectProduct).Item(level).Item(menuName).Remove("menu_state")
 Session("PID:" & projectProduct).Item(level).Item(menuName).Add "menu_state", state
response.write("[PID:" & projectProduct&"]["&level&"]["&menuName&"]["&state&"]<br>")
Next

输出空白

看起来它从来没有任何数据,但没有抛出任何错误。我是否正确读取了 POST 对象?

[编辑]

这是从 Fiddler 捕获的 RAW POST 数据:

data%5BsessionData%5D%5B0%5D%5BPID%5D=1&data%5BsessionData%5D%5B0%5D%5BLevel%5D=Main&data%5BsessionData%5D%5B0%5D%5BMenuName%5D=Kitchen&data%5BsessionData%5D%5B0%5D%5BState%5D=CHECKED

我在该字符串上使用了 URL 解码-

data[sessionData][0][PID]=1&data[sessionData][0][Level]=Main Level Plan&data[sessionData][0][MenuName]=Kitchen&data[sessionData][0][State]=CHECKED

看起来我现在应该可以使用

循环遍历字符串了
For Each part In Request.Form("data[sessionData]")

但什么也没发生。我添加了一个简单的循环来查看 request.form,这是它所看到的:

for each x in Request.Form
    Response.Write(x)
Next
' outputs -> data[sessionData][0][PID]data[sessionData][0][Level]data[sessionData][0][MenuName]data[sessionData][0][State]

我想这归结为只是正确地阅读和处理该字符串,或者如果发送了多个字符串,则为多个字符串。正确的?

【问题讨论】:

  • 如果我们可以看到 RAW HTTP POST 被发送到 ASP 页面会有所帮助,您可以使用 Fiddler 捕获吗?
  • 这是 Fiddler 发送的所有内容 - 响应字节(按 Content-Type) -------------- ~headers~: 252 text/html: 20
  • 这些是 Fiddler 的第一行 - 请求计数:1 已发送字节:1,446(标头:1,240;正文:206)收到的字节:272(标头:252;正文:20)
  • 这只是“统计”选项卡,要查看 RAW 请求和响应,请打开“检查器”选项卡,然后在底部面板中选择“RAW”,然后将该内容复制并粘贴到代码块中({ }) 带有edit 的问题,不要尝试将其发布在 cmets 中。
  • 要记住的一点是VBScript 代码不使用方括号——没有用方括号编写的命令、函数或运算符。 (您可以在您自己的变量名中使用方括号,但它们就像任何其他字符一样:它们不会神奇地将变量放入数组中。)因此,如果您发现自己正在编写一个没有用引号括起来的方括号,很可能,你犯了一个错误。

标签: php ajax vbscript asp-classic


【解决方案1】:

RAW 输出肯定有助于弄清楚发生了什么。

jQuery 正在将 JSON 结构转换为 HTTP POST 参数,但在此过程中,它会创建一些过于复杂的键名。

如果你分解键值对,你会得到类似的东西

data[sessionData][0][PID]=1
data[sessionData][0][Level]=Main Level Plan
data[sessionData][0][MenuName]=Kitchen
data[sessionData][0][State]=CHECKED

就 Classic ASP 而言,这只是字符串键和值对的集合,仅此而已。

找出这些键是什么的正确方法是做你在问题中所做的事情,但有一些小的变化。

For Each x In Request.Form
    Response.Write(x) & "=" & Request.Form(x) & "<br />"
Next

当输出为 HTML 时,它看起来类似于上面显示的细分。

了解了密钥是什么之后,您应该能够直接从 Request.Form() 集合中引用它们。

Dim pid: pid = Request.Form("data[sessionData][0][PID]")
Response.Write pid

输出:

1

【讨论】:

  • 仍然无法访问通过引用键名传递的其他值,例如 response.write("Level => " & part["Level"])。引发内部服务器错误
  • @user1601513 我以为我解释了键是什么? level 的值存储在键 data[sessionData][0][Level] 中,因此要输出它,您将使用 Response.Write Request.Form("data[sessionData][0][Level]")。请记住,键只是一个字符串值,没有任何推断,它只是一个字符串,用作标识已发布的特定数据的键。
  • @user1601513 我已经解释了如何访问键及其关联值。很抱歉,我只是不明白您从您不断发布的代码Main 中尝试做什么,但唯一的"Main" 是键"data[sessionData][0][Level]" 返回的值的一部分,整个值是@ 987654332@.
  • 很抱歉给您带来了困惑。我正在服用高水平的抗癌药物来治疗疼痛。我现在正在访问 POST 数据,因为我需要感谢您。感谢您对我的所有帮助和耐心。
  • @user1601513 没问题,别担心……很高兴能提供帮助。祝一切顺利。
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2014-04-21
  • 2015-11-19
  • 2014-01-10
相关资源
最近更新 更多