質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

3回答

5201閲覧

node.js の post 通信のエラー原因を調べたい

blossan

総合スコア154

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2016/12/11 12:48

御世話になります。
node.jsでapiを利用してpost通信をしたいと考えています。
利用するapiは、ソラコムというサービスのapiになります。
ソラコムapi リファレンス
実行環境は、awsのlambdaになります。

node.jsに関して、lambdaの書き方に関して、あまり慣れていませんが、teratailの回答者様に助言を頂き、無事コード自体は成功しました。

しかし、apiとしての受け取る情報をうまく取得できませんでした。
apiとして取得する情報は、認証情報になります。
post通信で、メールアドレスとパスワードを送信すると、それに対する認証キーを発行してくれるものになります。
ソラコムapiリファレンスページでは、一番上のauthという項目になります。

実際に実行したコードが以下になります。

node.js

1// Generated by CoffeeScript 1.10.0 2var https; 3 4https = require('https'); 5 6exports.handler = function(event, context) { 7 var headers,payload,options,req; 8 9 headers = { 10 "Accept": "application/json" 11 }; 12 13 payload = { 14 "email":"登録したメールアドレス", 15 "password":"登録したパスワード" 16 }; 17 18 options = { 19 contentType: 'application/json', 20 method: 'POST', 21 hostname: 'api.soracom.io', 22 port: 443, 23 path: '/v1/auth' 24 }; 25 26 req = https.request(options, function(res) { 27 res.setEncoding('utf8'); 28 return res.on('data', function(d) { 29 console.log(d); 30 context.succeed(d); 31 }); 32 }); 33 req.on('error', function(e) { 34 context.fail(e.message); 35 }); 36 req.write(JSON.stringify(payload)); 37 req.end(); 38}; 39

このコードを実行すると、成功したという表示とともに、以下のメッセージが表示されました。失敗すると赤色で表示されるので、post自体はうまく出来たと考えています。

node.js

1"{\"code\":\"COM0009\",\"message\":\"This content type [application/octet-stream] is not supported. Supported content type:[application/octet-stream,text/plain,application/xml,text/xml,application/x-www-form-urlencoded,application/*+xml,multipart/form-data,application/json,application/*+json,*/*] \"}"

文字コードが異なるというメッセージなのですが、post通信で文字コードは選択しているため、どこか原因が分からない状態です。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

node.jsのドキュメントは読みましたか?

node.jsのhttpsは、至るところに「httpを見てください(意訳)」という説明書きがあります。

node.jsのhttp.requestにはPOST時のサンプルが掲載されています。

headersの指定に、Content-Lengthも指定してください。(値は、post時のjsonデータの文字列長)

bash

1$ node -v 2v6.7.0 3 4$ diff question.js answer.js 519c19,23 6< contentType: 'application/json', 7--- 8> // contentType: 'application/json', 9> headers : { 10> 'Content-Type': 'application/json', 11> 'Content-Length': JSON.stringify(payload).length, 12> }, 1338a43,50 14> 15> // 以下、動作確認用(無視して良いです) 16> Context = function (){ 17> this.succeed = function(data){console.log('OK')}; 18> this.fail = function(data){console.log('NG')}; 19> } 20> context = new Context() 21> exports.handler(null, context) 22 23$ node answer.js 24{"apiKey":"XXXXX","operatorId":"XXXXXX","userName":null,"token":"XXXXX"} 25OK

投稿2016/12/12 02:01

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

以下でうまくいきませんか?

javascript

1var headers = { 2 "Accept": "application/json" 3}; 4 5options = { 6 "contentType": "application/json", 7 "headers":headers, 8 "method": "POST", 9 "hostname": "api.soracom.io", 10 "port": 443, 11 "path": "/v1/auth" 12 }; 13

投稿2016/12/12 00:55

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

This content type [application/octet-stream] is not supported.

サポートしていないcontent-typeを送っているようです。

documentをちらっと見た感じ、content-typeの渡し方が間違ってなので、以下のように修正すると良いと思います、

javascript

1 options = { 2 contentType: 'application/json', 3 method: 'POST', 4 hostname: 'api.soracom.io', 5 port: 443, 6 path: '/v1/auth' 7 }; 8 9 (変更) 10 11 options = { 12 headers: { 13 'content-type':'application/json' 14 }, 15 method: 'POST', 16 hostname: 'api.soracom.io', 17 port: 443, 18 path: '/v1/auth' 19 };

投稿2016/12/11 15:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

blossan

2016/12/12 00:08

回答ありがとうございます。headersに情報を変更したのですが、まだ【"{\"code\":\"COM0009\",\"message\":\"This content type [application/octet-stream] is not supported. Supported content type:[application/octet-stream,text/plain,application/xml,text/xml,application/x-www-form-urlencoded,application/*+xml,multipart/form-data,application/json,application/*+json,*/*] \"}"】というエラーが表示されています。受け取り方に問題があるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問