2017-06-20 144 views
0

我正尝试在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错误的要求,我怎么一开始就告诉过。

有人可以帮助我吗?

非常感谢你

+1

为什么没有'Content-Length:16'标题?另外URL是不同的? ('.json' vs'/ .json',这本身就是非常奇怪的页面名称)在内容之前,你还需要一个* double *'\ r \ n'。 –

+0

你好马克西米利安,我已经做了你的建议(你是对的),但我仍然有相同的答案从服务器(坏请求)。我认为它应该是与https相关的东西,如果我尝试连接到htttp ... un port 80,连接被拒绝(然而邮递员它工作)。随着GPRSmódem我收到好,哟连接请求,当我尝试https ...在端口443 –

+0

然后编辑您的问题,并添加当前代码与输出。此时,如果您将请求发送到URL“http:// httpbin.org/post”,现在会很好 - 答案将以JSON格式包含您的确切请求。然后,您可以调试gprs模块实际发送的内容,并可以在那里确定问题。如果看起来请求与Postman请求完全相同,但仍然不会返回任何内容,则发送GPRS命令的实现可能是错误的。另外我不明白你现在连接的端口是什么?如果没有TLS,在443发送原始HTTP请求将不起作用。 –

回答

0

不是一个解决方案,而是一边评论。通过使用这种表示法或类似方法,您可以使代码更小,更易读。

[编辑:]这帮助我分析你的要求和现场的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 */ 
); 
+0

您好Michaël,感谢您的评论你是正确的“内容长度”是14,没有16.但是这个改变并没有解决它继续给我同样的HTTP 400错误请求错误的问题。我将尝试实现这个不是理想的解决方案,但它可以工作:http://www.devacron.com/arduino-firebase/ –

0

我也是面临着同样的问题。

我设法通过处理发布:我用通用文本替换了所有值。

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请求有什么不同。

+0

请编辑您的答案,以说明'val'变量来自哪里。这似乎对你的答案至关重要。 – Phil

+0

代替val,我有一个int,例如100,只是为了测试它的工作原理(它适用于处理草图)。 我已经深入了解,可能是通过上面的arduino执行POST请求不会创建需要的json对象格式?我仍然在理解为什么会这样。处理草图或其他语言与我们做data = json.dumps(data)的区别是什么, – yukimach