2017-06-20 16 views
0

Firebase Databaseで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 

私はポストマンを使用して試してみました。郵便配達員の「Body TAB」に公開したいデータを書き込むときに動作します。

{ 
"param1":"7" 
} 

しかし、私は、私が本当に知りませんx-www-form-urlencodedでまたはテキスト形式でコードが必要だと思う:私は、JSON形式で記述します。私はsuccesfullのポストにポストマンによって生成された「コード」を参照してください場合

私はこれを持っている:私はGPRSモジュールに送信しようとしてきたものだと私は、どのように私はHTTPエラー400不正な要求を受け取る

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" } 

冒頭に語った。

誰かが私を助けることができますか?

ありがとうございました

+1

なぜ 'Content-Length:16'ヘッダがないのですか?また、URLは異なっていますか? ( '.json'対'/.json'、これは非常に奇妙なページ名です)また、コンテンツの前にヘッダーの後に*ダブル* '\ r \ n'が必要です。 –

+0

こんにちはマクシミリアン、私はあなたの提案(あなたは正しい)を行ったが、私はまだサーバーからの同じ回答を持っている(悪い要求)。htttpに接続しようとすると、httpsに関連するものでなければならないと思います... un port 80、接続は拒否されています(ただし、郵便番号で動作します)。私はGPRSmódemで、私はhttpsに接続しようとすると接続要求を受け取ります...ポート443 –

+0

質問を編集し、出力に現在のコードを追加します。この時点でリクエストがURL http:// httpbin.org/postに送信された場合、これはうまくいくでしょう。答えにはJSON形式のリクエストが含まれています。その後、gprsモジュールが実際に送信するものをデバッグし、そこで問題を特定できます。要求がPostmanの要求と同じだがまだ何も返されていないように見える場合、GPRSコマンドを送信する実装が間違っている可能性があります。また、私は今あなたが接続しているポートを理解していませんでしたか? 443で未処理のHTTPリクエストを送信すると、TLSなしでは機能しません。 –

答えて

0

解決策ではありません。この表記法などを使用して、コードを小さくして読みやすくすることができます。

[EDIT:]これは私があなたの要求を解析し、それは私も同じ問題に直面しています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、あなたのコメントのおかげであなたは正しかった "Content-Lenght"は14、いいえ16だった。しかし、この変更は問題を解決しない私に同じHTTP 400 Bad Requestエラーを与え続ける。私は望ましいソリューションではありませんが、このソリューションを実装しようとしますが、うまくいく可能性があります:http://www.devacron.com/arduino-firebase/ –

0

する必要がありながらContent-Lengthは、16であることを発見し支援してきました。

私は処理して投稿することができました。すべての値を一般的なテキストに置き換えました。

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")); 

私はATコマンド経由で私のArduinoの上のPOSTリクエストを作成しようとしました:

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オブジェクトフォーマットが作成されないことがありますか?私はまだこれがなぜ起こっているのかを理解しています。処理スケッチや他の言語との違いは何ですか?データ= json.dumps(データ)、 – yukimach