英特尔伽利略Azure REST呼叫

英特尔伽利略Azure REST呼叫,rest,azure,arduino,httpclient,intel-galileo,Rest,Azure,Arduino,Httpclient,Intel Galileo,我试图通过调用azure中作为web应用程序托管的microsoft web api(REST服务),来利用我的Intel Galileo Gen2 但我得到的只是一个azure 404,上面说它找不到我的应用程序 我的arduino上的代码如下 #include <SPI.h> #include <Ethernet.h> // Enter a MAC address for your controller below. // Newer Ethernet shield

我试图通过调用azure中作为web应用程序托管的microsoft web api(REST服务),来利用我的Intel Galileo Gen2 但我得到的只是一个azure 404,上面说它找不到我的应用程序

我的arduino上的代码如下

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
char serverName[] = "wack.azurewebsites.net";

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    while(true);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:  
  if (client.connect(serverName, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /api/warning HTTP/1.0");
    client.println();
  } 
  else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}
它们都不起作用,有些甚至连联系都没有 然而,它只返回404,即使该URL是有效的,并且在不同的网络应用程序中测试,即使在同一网络上


我已经用设备的地址替换了mac地址,并且之前已经确认,通过使其本身成为web服务器,可以在网络中访问该设备。基本上,它可以抓取互联网设置,但由于某些原因将无法连接到我的rest服务。感谢您的任何帮助。Thx

问题在于没有为呼叫提供主机。我来自c#背景,认为用服务器地址初始化HttpClient就足够了,但显然您必须提供这一行

client.println(“GET/api/warning HTTP/1.1”);
client.println(“主机:wack.azurewebsites.net”);
client.println(“用户代理:英特尔伽利略”);
client.println(“连接:关闭\r\n”);

每次发出请求时

都会丢失主机标题

当然,您必须将其与每个请求一起发送

您还应该发送
User-Agent
Connection:close
成为一个好的HTTP公民。后者告诉web服务器“不要让套接字保持打开状态,因为我会马上挂断”。HTTP/1.1默认为

将您的请求修改为如下所示:

client.println(“GET/api/warning HTTP/1.1”);
client.println(“主机:wack.azurewebsites.net”);
client.println(“用户代理:英特尔Fakelileo”);
client.println(“连接:关闭\r\n”);
一个简单的测试:

$ telnet {sitename}.azurewebsites.net 80                              

Connected to waws-prod-am2-119.cloudapp.net.
Escape character is '^]'.
GET / HTTP/1.1
Host: {sitename}.azurewebsites.net
User-agent: Intel Fakelileo
Connection: close


HTTP/1.1 200 OK
Content-Length: 84
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/8.0
...

主机
头是由HTTP/1.1协议规定的,它不是特定于语言的:但我是用HTTP/1.0协议发送的Azure应用程序服务不支持HTTP/1.0。为了实现这一点,每个web应用程序都需要自己的公共IP地址,这在今天是一个完全不合理的提议,更不用说HTTP/1.0是一个Gopher时代的协议(1991-1996)。Marcu-希望你不介意,我编辑了你的答案,添加了完整的请求。
$ telnet {sitename}.azurewebsites.net 80                              

Connected to waws-prod-am2-119.cloudapp.net.
Escape character is '^]'.
GET / HTTP/1.1
Host: {sitename}.azurewebsites.net
User-agent: Intel Fakelileo
Connection: close


HTTP/1.1 200 OK
Content-Length: 84
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/8.0
...