我想从Arduino向rails服务器发送PUT请求。
这适用于curl:
curl -X PUT -d "barrel[gallons]=99" 192.168.0.7:3000/barrels/1
服务器获取呼叫并更新加仑属性。
我不知道如何在Arduino中格式化此消息。
String request = "PUT /barrels/1.json?barrel[gallons]=99 HTTP/1.0";
send_request(request);
Adafruit_CC3000_Client client = cc3000.connectTCP(ip, port);
// Send request
if (client.connected()) {
client.println(request);
Serial.println("Connected & Data sent");
}
它成功连接到客户端但消息无效。我该如何格式化请求?
答案 0 :(得分:0)
如果它适用于curl,你希望Arduino生成完全相同的消息。问题当然是如何找出它应该是什么样子。在这种情况下,我通常使用调试代理来拦截消息。我所知道的最方便的调试代理是Fiddler2.但是在简单的情况下,netcat或ncat之类的工具就足够了。另一种方法是用wireshark.
嗅探连接一旦你看到流量,通常很容易解决所有这类问题。
答案 1 :(得分:0)
请注意,cURL中的PUT
请求将成为TCP消息,如下所示:
PUT /barrels/1 HTTP/1.1
User-Agent: curl/7.21.7 (i386-pc-win32) libcurl/7.21.7 OpenSSL/0.9.8r zlib/1.2.5
Host: 192.168.0.7:3000
Accept: */*
Content-Length: 18
Content-Type: application/x-www-form-urlencoded
barrel[gallons]=99
使用Adafruit_CC3000_Client
,您使用的是TCP客户端,而不是HTTP客户端。
另外
/barrels/1.json?barrel[gallons]=99
更像是GET
然后是PUT
请求。我确实会使用GET请求,因为这样我就不会被迫提供消息体。所以,我会尝试:
String request = "GET /barrels/1?barrel[gallons]=99 HTTP/1.1";
//send_request(request); //Why here?
Adafruit_CC3000_Client client = cc3000.connectTCP(ip, port);
// Send request
if (client.connected()) {
client.println(request);
client.println(); //Empty line to terminate header required.
Serial.println("Connected & Data sent");
}