我正在使用NodeMCU来使用ESP8266,我想使用ipify来获取公共IP地址。
但我在httpCode
得到-1。那是为什么?
如果我输入api.ipify.org
,它会正确获取我的公共IP地址。
void loop() {
Serial.println(WiFi.status());
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
Serial.println("az");
HTTPClient http; //Declare an object of class HTTPClient
http.begin("https://api.ipify.org/?format=json"); //Specify request destination
int httpCode = http.GET(); //Send the request
Serial.println(httpCode); //<<---- Here I get -1
if (httpCode > 0) { //Check the returning code
String payload = http.getString(); //Get the request response payload
Serial.println(payload); //Print the response payload
}
http.end(); //Close connection
}
delay(10000); //Send a request every 30 seconds
}
答案 0 :(得分:1)
http.begin("https://api.ipify.org/?format=json");
您正在使用HTTPClient浏览HTTPS网站(HTTP + SSL / TLS隧道),但您使用了错误的.begin()
电话。 begin(String url
来电需要http://
网址,而不是https://
。如果您想使用HTTPS安全地浏览网站,则需要使用函数begin(String url, String httpsFingerprint)
(docs)。您可以按照link找到所需的httpsFingerprint
。但是,使用HTTPS会导致大量的内存开销和处理时间。对于浏览“我的公共IP是什么”网站的情况,我建议改为浏览http://
版本,因为回复不是机密信息。
所以,你可以做到
http.begin("http://api.ipify.org/?format=json");
答案 1 :(得分:0)
您可以尝试:
String getIp()
{
WiFiClient client;
if (client.connect("api.ipify.org", 80))
{
Serial.println("connected");
client.println("GET / HTTP/1.0");
client.println("Host: api.ipify.org");
client.println();
} else {
Serial.println("Connection to ipify.org failed");
return String();
}
delay(5000);
String line;
while(client.available())
{
line = client.readStringUntil('\n');
Serial.println(line);
}
return line;
}