首页 > 解决方案 > ESP 8266 在同一个客户端上多次获取调用?

问题描述

我正在尝试使用同一个客户端进行多次 GET 调用。我已经尝试了很多东西。新变量,新实例。关闭客户。第二个股票电话永远不会通过。它在第二次调用的“while (client.connected())”处失败。它不会返回标题。

有任何想法吗?

代码看起来像这样

void loop()
{
    
    WiFiClientSecure client;
//Stock
      String payload;
    // Use WiFiClientSecure class to create TLS connection
    Serial.print("connecting to ");
    Serial.println(host);
    Serial.printf("Using fingerprint '%s'\n", fingerprint);
    client.setFingerprint(fingerprint);

    if (!client.connect(host, httpsPort))
    {
        Serial.println("connection failed");
        client.stop();
    
        //return;
    }

//AAPL

    String url = "/api/v1/quote?symbol=AAPL&token=XXXX";
    Serial.print("requesting URL: ");
    Serial.println(url);

    client.print(String("GET ") + url + " HTTP/1.0\r\n" +
                 "Host: " + host + "\r\n" +
                 "User-Agent: BuildFailureDetectorESP8266\r\n" +
                 "Connection: close\r\n\r\n");

    Serial.println("request sent");
    while (client.connected())
    {
        String line = client.readStringUntil('\n');
//        String line = client.readStringUntil('\r');
        Serial.println(line);
        if (line == "\r")
        {
            Serial.println("headers received");
            payload = client.readStringUntil('\r');
            
            //break;
        }
    }
    Serial.println("payload");
    Serial.println(payload);
    // String line = client.readString();
    //JsonObject& obj = doc.parseObject(payload);
    StaticJsonDocument<200> doc;   
    DeserializationError error = deserializeJson(doc, payload);

    // Test if parsing succeeds.
    if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
//    return;
      client.stop();
    }

//{"c":23.35,"d":-0.73,"dp":-3.0316,"h":24.6986,"l":23.25,"o":24.54,"pc":24.08,"t":1627588802}
    double currentprice = doc["c"];
    double pctchg = doc["d"];
      
    // Print values.
    Serial.println(currentprice);
    Serial.println(pctchg);    
    Serial.println("closing connection");
    client.stop();
    delay(20000);
//SPY
    String spyurl = "/api/v1/quote?symbol=SPY&token=XXXX";
    Serial.print("requesting URL: ");
    Serial.println(spyurl);

    client.print(String("GET ") + spyurl + " HTTP/1.0\r\n" +
                 "Host: " + host + "\r\n" +
                 "User-Agent: BuildFailureDetectorESP8266\r\n" +
                 "Connection: close\r\n\r\n");

    Serial.println("request sent");
    String spypayload;


  
    while (client.connected())
    {
        String spyline = client.readStringUntil('\n');
//        String line = client.readStringUntil('\r');
        Serial.println(spyline);
        if (spyline  == "\r")
        {
            Serial.println("headers received");
            spypayload = client.readStringUntil('\r');
            //break;
        }
    }
    Serial.println("spypayload");
    Serial.println(spypayload);
    // String line = client.readString();
    //JsonObject& obj = doc.parseObject(payload);

    StaticJsonDocument<200> spydoc;   
    DeserializationError spyerror = deserializeJson(spydoc, spypayload);

    // Test if parsing succeeds.
    if (spyerror) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(spyerror.f_str());
//    return;
      client.stop();
    }

//{"c":23.35,"d":-0.73,"dp":-3.0316,"h":24.6986,"l":23.25,"o":24.54,"pc":24.08,"t":1627588802}
    double SPYcurrentprice = spydoc["c"];
    double SPYpctchg = spydoc["d"];
      
    // Print values.
    Serial.println(SPYcurrentprice);
    Serial.println(SPYpctchg);    
    Serial.println("closing connection");
    client.stop();
    

标签: httpsgetesp8266

解决方案


我是个白痴。

需要在第一次通话时保持连接打开

"连接:保持活动\r\n\r\n");


推荐阅读