【问题标题】:Read AJAX post content using JAVA socket server使用 JAVA 套接字服务器读取 AJAX 帖子内容
【发布时间】:2014-02-06 15:53:55
【问题描述】:

我设置了一个 JAVA 套接字服务器,它能够从 html

中获取所有内容。但是对于AJAX post,服务器只能获取POST事件,而无法读取AJAX post里面的“数据”。以下是html代码:

HTML

<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">
</script>

<script type="text/javascript">
$(document).ready(function() {
     $('#submit').click(function() {
//information to be sent to the server

info = $('#foo').val();
$.ajax({
  type: "POST",
  url: 'http://10.0.0.3:8888',
  data: ({foo: info}),
  //crossDomain: true,
  dataType: 'json'
});

return false;       
});

});
</script>

</head>
<body>

<label>Text</label>
<textarea id="foo"></textarea>

<button id="submit">Submit via Ajax</button>

</body>
</html>

我不知道为什么会这样,有什么建议吗?

谢谢

------------------------------------------ --------------------------------------------------

更新

Java 服务器代码

    ServerSocket ss = new ServerSocket(8888);
    Socket s = ss.accept();

    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

    String inputLine;
    while (!(inputLine = in.readLine()).equals(""))
        System.out.println(inputLine);

    PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
    pw.println("aa");

    s.close();
    ss.close();

我在服务器上得到的是这样的:

POST / HTTP/1.1
Host: 10.109.3.184:8888
Connection: keep-alive
Content-Length: 58
Accept: */*
Origin: xxxxxxxxxxxxxxxxxx
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: xxxxxxxxxxxxxxxxxx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4

内容没有出现...

【问题讨论】:

  • 您能否展示一个有效的 html 表单示例?
  • 这个“socket server”是你自己的代码吗?你能提供样品吗?就我而言,它看起来就像您只阅读请求标头,而不是内容,即 \r\n\r\n 之后的所有内容。
  • 你为什么要尝试使用 java 套接字服务器?你在尝试 websocket 或 bosh 或任何其他连接吗?
  • @Kevin 例子是不使用AJAX直接提交表单。
  • @Cromax 谢谢,我将代码(更新后的)更改为循环读取。但是内容没有显示出来。

标签: java javascript jquery ajax


【解决方案1】:

HTTP 请求中的 POST 数据以请求体的形式出现,它与头部之间用空行分隔,如下所示:

POST / HTTP/1.1
Host: 10.0.1.1:80
Connection: keep-alive
Content-Length: 29
Content-Type: text/json

{"id":123,"name":"something"}

所以你的服务器代码应该(更多或更少);-) 看起来像这样:

BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

String line;
List<String> headers = new LinkedList<>();
StringBuilder body = null;
while ((line = in.readLine()) != null) {
    //- Here we test if we've reach the body part.
    if (line.isEmpty() && body == null) {
        body = new StringBuilder();
        continue;
    }
    if (body != null) {
        body.append(line).append('\n');
    }
    else {
        headers.add(line);
    }
}

System.out.println("--- Headers ---");
for (String h : headers) {
    System.out.println(h);
}
System.out.println("--- Body ---");
System.out.println(body != null ? body.toString() : "");

请注意,此代码仅用于测试目的。您不能假设该正文是文本(至少您应该验证 Content-Type 标头)并且您可以安全地将其读入 StringBuilder 或者是否可以安全地将其全部加载到内存中(至少您应该验证 Content -长度标头)。尽管有这些标题,但您应该期待最坏的情况,并且在阅读期间执行一些完整性检查。

【讨论】:

  • 是的,你完全正确。还有一件事:当我做AJAX“POST”时,为什么只有在网页重新加载后才能被服务器接收到?
  • 我怀疑它是否真的像你描述的那样工作。想象一下,您有一个带有一个文本输入的表单,您在其中键入了Joe,并且在将其发送到服务器之后,您想在 HTML 中使用Hello, Joe(使用此表单输入)发送响应 --- 如何重新加载页面之前服务器收到请求?首先它需要获取请求,然后它可以发送响应。也许它会发生,您的日志输出被缓存并在页面重新加载后被刷新。
  • 嗯,这两者都有可能。感谢您带领我走到今天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2021-05-27
相关资源
最近更新 更多