cURL到Arduino的翻译

时间:2013-11-30 23:00:59

标签: ruby-on-rails http curl arduino

我想从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");
} 

它成功连接到客户端但消息无效。我该如何格式化请求?

2 个答案:

答案 0 :(得分:0)

如果它适用于curl,你希望Arduino生成完全相同的消息。问题当然是如何找出它应该是什么样子。在这种情况下,我通常使用调试代理来拦截消息。我所知道的最方便的调试代理是Fiddler2.但是在简单的情况下,netcatncat之类的工具就足够了。另一种方法是用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");
}