当前位置: 首页 > 知识库问答 >
问题:

HTTP请求未正确发送数据

司徒宏远
2023-03-14

我制作了一个简单的JavaScript页面,当按下“发送”按钮时,该页面应该显示时间表并通过HTTP发送数据。

数据应该发送到一个Arduino使用这个简单的方案:

http://arduinoip/DATASTARTSHEREhh:mm;hh:mm;hh:mm;[...];DATAENDSHERE

我使用以下代码打印我在Arduino串行监视器中收到的所有数据:

void loop() {
  // listen for incoming clients
  EthernetClient client = ArduinoServer.available();
  String message = "";
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        message += c;
        if (c == '\n' && currentLineIsBlank) {
          cmd = message.indexOf(DATASTARTING);
          Serial.print("CMD Value: ");
          Serial.println(cmd);
          if(cmd > 0){
            //I received some data and i want to know what it is.
            msg = message.c_str();
            char actChar = msg[cmd + 14]; //14 is the size of the string "DATASTARTSHERE"
            Serial.print("First character of data I'm interested in: ");
            Serial.println(actChar);
            int count = 0;
            values = "";
            while(actChar != 'D'){
              values += actChar;
              count++;
              actChar = msg[cmd + 14 + count];
            }
            Serial.print("Values i got: ");
            Serial.println(values);
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            //client.println(params_to_html());
            client.println("I received data");
            client.println("</html>");
            Serial.println(message);
            break;
          }else{
            // send a standard http response header
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("I didn't receive data");
            client.println("</html>");
            Serial.println(message);
            break;
          }
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }  
}

我收到的数据如下:

新客户

CMD值:-1

获取 /DATASTARTSHERE10: 10; 11:11; 12:12; 13:13; 14:14; 15:15; 16:16; 17:17; 18:18; 19:19; 20:20; 21:21; 22:22; 23:23; DATAENDSHERE HTTP/1.1

主持人:192.168.1.32

连接:保持活力

升级不安全的请求:1

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/62.0.3202.94 Safari/537.36

接受:text/html, Application/xhtml xml, Application/xml; q=0.9, Image/webp, Image/apng,/; q=0.8

接受编码:gzip,deflate

客户端断开连接

新客户

CMD值:-1

GET/favicon.icoHTTP/1.1

主持人:192.168.1.32

连接:保持活力

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/62.0.3202.94 Safari/537.36

接受:image/webp、image/apng、image/、/*;q=0.8

推荐人:http://192.168.1.32/DATASTARTSHERE10:10;11:11;12:12;13:13;14:14;15:15;16:16;17:17;18:18;19:19;20:20;21:21;22:22;23:23;DATAENDSHERE

接受编码:gzip,deflate

接受-语言: it-IT, it; q=0.9,

客户端断开连接

有两件事我不明白:

>

  • 为什么我得到两个回应?一个带GET /whatisaftertheURL一个带GET/favicon.ico?

    为什么cmd值是-1,即使我给它的值indexOf(DATASTARING)DATASTARING是一个const char*"DATASTARTSHERE"值在里面?

    如果我删除一些行,比如

    Serial.print("CMD Value: ");
    Serial.print("First character of data I'm interested in: ");
    Serial.println(actChar);
    

    cmd成为消息中datastartsher的正确索引,但我不知道这些行与cmd的值有什么关系,因为在执行这些行之前会对其进行比较。

    我没有再次触发它,但添加了一些其他行来拆分消息,在拆分之前打印消息只打印我在mi JS页面中发送的值的一半。

    这对我来说没有意义,那么我可以从网页上接收的内容有限制吗?

    我没有发布我的JS页面的代码,因为我发现它是不必要的,但如果不是,我会发布它。

  • 共有1个答案

    诸嘉澍
    2023-03-14

    浏览器总是请求Favicon.ico,请在这里阅读

    AFAIK你可以阻止它的发生,但它不是真正必要的,可以安全地忽略。

    对于第二个问题,indexOf()如果在数组或字符串中找不到元素,则返回-1,以便在检查时消息不包含数据启动

    可能是c=='\n'

     类似资料:
    • 很多时候我们需要在页面打开的时候,读取远程的内容,然后在当前页面显示. 这就需要用到 http请求了. vue页面调用http请求 vuejs 内置了对发送http请求的支持. 只需要在对应页面的script 标签内加上对应的代码就好. 例如: 我们新增一个页面,叫 "博客列表页" : src/components/BlogList.vue, 内容如下: <template> <div >

    • 这个请求在postman中工作得非常好,所以我认为它与cors相关,并安装了fastify-cors,但我仍然得到同样的错误。 有人有什么建议如何解决这个问题吗?

    • 我是一个使用angular的新手,我正在努力学习一点,但我不能使用令牌进行简单的获取。我做了很多研究,最后总是得到这段代码。 对于我的后端,我使用Kotlin/Springboot并配置了Cors。 即使如此,当尝试这样做请求我得到这个错误。 访问位于“”的XMLHttpRequesthttp://localhost:5000/api-v1/来源的帐户/列表 -- 果心js:15713错误Http

    • 我试图将一些数据发送到API,但Zapier只会发送我体内的第一行,任何关于如何将所有数据发送到API的建议。因此,在下面的代码中,将发送,但将不发送。

    • 这里是LocationSearchMetaData.java 我的控制器 我的客户要求是这样的 下面是实际数据请求 获取时出错I:

    • 本文向大家介绍详解Java发送HTTP请求,包括了详解Java发送HTTP请求的使用技巧和注意事项,需要的朋友参考一下 前言 请求http的Demo是个人亲测过,目前该方式已经在线上运行着。因为是http请求,所有发送post 和get 请求的demo都有在下方贴出,包括怎么测试,大家可直接 copy到自己的项目中使用。 正文 使用须知 为了避免大家引错包我把依赖和涉及到包路径给大家 HTTP 发