2017-06-20 99 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