Firebase AT命令HTTP POST
我正尝试在Firebase数据库中使用GPRS模块发布帖子。调制解调器的AT命令由Arduino Uno发送。Firebase AT命令HTTP POST
GPRScommand("AT+CIPSEND", ">", "yy", 10000, 1);
delay(500);
GPRSboard.print("POST /.json?auth=");
GPRSboard.print(FIREBASE_AUTH);
GPRSboard.print(" HTTP/1.1");
GPRSboard.print("\r\n");
GPRSboard.print("Host: ");
GPRSboard.print("XXXXXXXXXXXXXXX-461a8.firebaseio.com");
GPRSboard.print("\r\n");
GPRSboard.print("Content-Type: ");
GPRSboard.print("application/json");
GPRSboard.print("\r\n");
GPRSboard.print("Content-Length: 16");
GPRSboard.print("\r\n");
GPRSboard.print("Cache-Control: ");
GPRSboard.print("no-cache");
GPRSboard.print("\r\n");
GPRSboard.print("\r\n");
GPRSboard.print("{\"param1\":\"7\"}");
GPRScommand(end_c, "HTTP/1.1", "yy", 30000, 1);
它返回我:
+CIPRCV:384,HTTP/1.1 400 Bad Request
我一直在使用邮差尝试。当我编写我想在邮差的“身体标签”中发布的数据时,它就可以工作。我写的JSON格式:
{
"param1":"7"
}
但我想我需要在X WWW的形式,进行了urlencoded或文本格式的代码,我真的不知道。
如果我看到邮差产生的“代码”,在succesfull后我有这样的:
POST /.json?auth=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX HTTP/1.1
Host: XXXXXXXXXXXXXXX-461a8.firebaseio.com
Content-Type: application/json
Cache-Control: no-cache Postman-Token: 2f95151e-52e1-28e7-9583-c0a8f50f77d7
{ "param1":"7" }
这就是我试图发送到GPRS模块,我收到HTTP 400错误的要求,我怎么一开始就告诉过。
有人可以帮助我吗?
非常感谢你
不是一个解决方案,而是一边评论。通过使用这种表示法或类似方法,您可以使代码更小,更易读。
[编辑:]这帮助我分析你的要求和现场的Content-Length
是16,而它应该是14
GPRSboard.print(
"POST /.json?auth=" + FIREBASE_AUTH + " HTTP/1.1\r\n"
"Host: XXXXXXXXXXXXXXX-461a8.firebaseio.com\r\n"
"Content-Type: application/json\r\n"
"Content-Length: 16\r\n"
"Cache-Control: no-cache\r\n"
"\r\n"
"{\"param1\":\"7\"}" /* <- contents is only this line, 14 bytes */
);
您好Michaël,感谢您的评论你是正确的“内容长度”是14,没有16.但是这个改变并没有解决它继续给我同样的HTTP 400错误请求错误的问题。我将尝试实现这个不是理想的解决方案,但它可以工作:http://www.devacron.com/arduino-firebase/ –
我也是面临着同样的问题。
我设法通过处理发布:我用通用文本替换了所有值。
PostRequest post = new PostRequest("https://XXXXXX.firebaseio.com/message_list.json");
post.addJson("{\"Key\":" + 100 + "}");
post.addHeader("Content-Type", "application/json");
post.addHeader("Authorization", "key=XXXXXX");
post.send();
System.out.println("Reponse Content: " + post.getContent());
System.out.println("Reponse Content-Length Header: " + post.getHeader("Content-Length"));
我试图通过创建我的Arduino POST请求的AT命令:
char* request = "POST/HTTP/1.0\r\nHost: XXXXXX.firebaseio.com/.json?auth=XXXXXX\r\nContent-Type: application/json\r\nContent-Length: XX\r\n\r\n{\"Key\":\"value\"}\r\n";
也格式为:
char* request = "POST/HTTP/1.0\r\nHost: https://XXXXXX/message_list.json\r\nAuthorization: key=XXXXXX\r\nContent-Type: application/json\r\nContent-Length: 13\r\n\r\n{\"hello\":\"2\"}";
也试过,没有内容
char* request = "POST/HTTP/1.1\r\nHost: https://airwatch-yuki.firebaseio.com/message_list.json\r\nAuthorization: key=AIzaSyAgYd0MIblEmo4elyxAYpAdgXhNTweVqhw\r\nContent-Type: application/json\r\nContent-Length: 0\r\n\r\n";
哪些文章
POST/HTTP/1.0
Host: https://XXXXXX.firebaseio.com/message_list.json
Authorization: key=XXXXXX
Content-Type: application/json
Content-Length: 13
{"hello":"2"}
但得到以下错误:
+IPD,179:HTTP/1.0 400 Bad Request
Content-Length: 54
Content-Type: text/html; charset=UTF-8
Date: Thu, 23 Nov 2017 18:08:48 GMT
<html><title>Error 400 (Bad Request)!!1</title></html>CLOSED
我最初有,当我创造了处理代码巴德请求。但是,当我使用.addjson函数获取键值时,解决了这个问题。我不确定与char请求有什么不同。
为什么没有'Content-Length:16'标题?另外URL是不同的? ('.json' vs'/ .json',这本身就是非常奇怪的页面名称)在内容之前,你还需要一个* double *'\ r \ n'。 –
你好马克西米利安,我已经做了你的建议(你是对的),但我仍然有相同的答案从服务器(坏请求)。我认为它应该是与https相关的东西,如果我尝试连接到htttp ... un port 80,连接被拒绝(然而邮递员它工作)。随着GPRSmódem我收到好,哟连接请求,当我尝试https ...在端口443 –
然后编辑您的问题,并添加当前代码与输出。此时,如果您将请求发送到URL“http:// httpbin.org/post”,现在会很好 - 答案将以JSON格式包含您的确切请求。然后,您可以调试gprs模块实际发送的内容,并可以在那里确定问题。如果看起来请求与Postman请求完全相同,但仍然不会返回任何内容,则发送GPRS命令的实现可能是错误的。另外我不明白你现在连接的端口是什么?如果没有TLS,在443发送原始HTTP请求将不起作用。 –