【问题标题】:What is the required format for an Ajax GET response?Ajax GET 响应所需的格式是什么?
【发布时间】:2017-12-14 22:50:23
【问题描述】:

我在尝试将元素添加到 Arduino 应用程序发送的响应流以响应 AJAX 请求时遇到了一个重大问题。我有一条消息成功通过,但是当我向其中添加一个额外的组件时,该消息未被读取。通过使用 Wireshark 监控以太网流量,我确定附加元素没有被完全终止。

我使用的代码是:

void SendTags(EthernetClient cl) {
  String value;      // stores value read from analog onputs
  int count;         // index for 'for' loops
  int str_length;
  char msg_chrs[0];

  Serial.println("Debug 395 - sending title and tags");
  cl.write("<?xml version = \"1.0\" ?>\r\n");

  Str = "<app_data>\r\n";
  str_length = Str.length()+1;
  Str.toCharArray(msg_chrs, str_length);
  cl.write(msg_chrs);

  Str = "<tags>\r\n";
  str_length = Str.length()+1;
  Str.toCharArray(msg_chrs, str_length);
  cl.write(msg_chrs);

  for (count = 0; count < di_count; count++) {
    value = di_sig_tag[count];
    Str = "<DI_TAG>" + value + "</DI_TAG>\r\n";
    str_length = Str.length()+1;
    Str.toCharArray(msg_chrs, str_length);
    cl.write(msg_chrs);
 }

 //(similar code sections omitted for simplicity)

  Str = "</tags>\r\n";
  str_length = Str.length()+1;
  Str.toCharArray(msg_chrs, str_length);
  cl.write(msg_chrs);

//  Str = "<title>\r\n";
//  str_length = Str.length()+1;
//  Str.toCharArray(msg_chrs, str_length);
//  cl.write(msg_chrs);

//  Str = "<pr_name>" + pr_name + "</pr_name>\r\n";
//  str_length = Str.length()+1;
//  Str.toCharArray(msg_chrs, str_length);
//  cl.write(msg_chrs);

//  Str = "</title>\r\n";
//  str_length = Str.length()+1;
//  Str.toCharArray(msg_chrs, str_length);
//  cl.write(msg_chrs);

  Str = "</app_data>\r\n";
  str_length = Str.length()+1;
  Str.toCharArray(msg_chrs, str_length);
  cl.write(msg_chrs);

  Serial.println("Debug 462 - End of SendTags()");
}

在 Wireshark 中,成功传输的元素使用 HTTP 协议显示,并且每个包都有一个元素,每个包都按预期以“\r\n”结尾。:

如果我启用可疑代码,则 HTML 标头为:

带有相关文本的消息部分是:

如您所见,关闭的“>”和终止的“\r\n”没有被传输。我通过剪切和粘贴成功的元素然后进行适当的编辑来生成插入的元素,并且还尝试了Stringchar[] 变量的一些排列,但都没有成功。但从 Wireshark 跟踪来看,问题出在 Arduino 代码和以太网链路之间。

任何想法或 cmets 将不胜感激。

【问题讨论】:

  • @JeanPaul98 他问的是关于从服务器发送响应而不是如何在 JavaScript 中处理接收到的响应。
  • msg_chrs 数组的长度为 0。您希望在其中放入什么?
  • 这不是它的工作原理。 Str.toCharArray 不会改变数组的长度。越界写入是未定义的行为。
  • 不能直接写Str吗? cl.write(Str);?

标签: javascript ajax arduino ethernet


【解决方案1】:

作为记录,(以及任何可能感兴趣的人),我采用的可行解决方案是:

void SendTags(EthernetClient cl)
{
  String value;      // stores value read from analog onputs
  int count;         // index for 'for' loops
  int str_length;
  char msg_chrs[0];

  Serial.println("Debug 395 - sending title and tags");
  cl.write("<?xml version = \"1.0\" ?>\r\n");
  cl.write("<app_data>\r\n");
  cl.write("<tags>\r\n");

  for (count = 0; count < di_count; count++)
  {
    value = di_sig_tag[count];
    Str = "<DI_TAG>" + value + "</DI_TAG>\r\n";
    ethWrite(Str, cl);
 }

  for (count = 0; count < do_var_count; count++)
  {
    value = do_sig_tag[count];
    Str = "<DO_TAG>" + value + "</DO_TAG>\r\n";
    ethWrite(Str, cl);
  }

    for (count = 0; count < ai_count; count++)
  {
    value = ai_sig_tag[count];
    Str = "<AI_TAG>" + value + "</AI_TAG>\r\n";
    ethWrite(Str, cl);
  }

  for (count = 0; count < ao_count; count++)
  {
    value = ao_sig_tag[count];
    Str = "<AO_TAG>" + value + "</AO_TAG>\r\n";
    ethWrite(Str, cl);
  }

  cl.write("</tags>\r\n");
  cl.write("<title>\r\n");

  Str = ("<PR_NAME>" + pr_name + "</PR_NAME>\r\n");
  ethWrite(Str, cl);

  cl.write("</title>\r\n");
  cl.write("</app_data>\r\n");

  Serial.println("Debug 462 - End of SendTags()");
}

void ethWrite(String st, EthernetClient cl)
{
  int st_length = st.length()+1;
  char msg_chrs[st_length];
  Str.toCharArray(msg_chrs, st_length);
  cl.write(msg_chrs);
}

到目前为止,这是我想要的,并且似乎是相当有效的编码。感谢@gre-gor for cmets - 让我走上正轨。我的借口是我同时使用 javascript(允许扩展数组)和 c++(不允许扩展)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多