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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

710閲覧

pythonからのJSONを上手く受け取れない

GenkiMatsushima

総合スコア24

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2018/09/18 17:41

編集2018/09/18 17:54

まずはサンプルを見てください。

sample.py

1import json 2import falcon 3import MySQLdb 4from MySQLdb.cursors import DictCursor 5 6print("hello response code") 7 8class CORSMiddleware: 9 def process_request(self, req, resp): 10 resp.set_header('Access-Control-Allow-Origin', '*') 11 12class PostResource(object): 13 14 # postされた時の動作 15 def on_post(self, req, res): 16 17 body = req.stream.read() 18 data = json.loads(body) 19 20 # パラメーターの取得 21 name = data['name'] 22 id = data['id'] 23 24 connection = MySQLdb.connect( 25 host='localhost', 26 port=3306, 27 user='root', 28 passwd='password', 29 db='sample', 30 charset='utf8', 31 cursorclass=MySQLdb.cursors.DictCursor 32 ) 33 cursor = connection.cursor() 34 sql = "select * from business_term" 35 36 cursor.execute(sql) 37 data = cursor.fetchall() 38 39 cursor.close() 40 connection.commit() 41 connection.close() 42 43 res.status = falcon.HTTP_200 44 res.body = json.dumps(data) 45 print(res.body) 46 print("取得完了") 47 48app = falcon.API(middleware=[CORSMiddleware()]) 49app.add_route("/", PostResource()) 50 51 52if __name__ == "__main__": 53 from wsgiref import simple_server 54 httpd = simple_server.make_server("0.0.0.0", 8000, app) 55 httpd.serve_forever() 56 57

Python側のres.bodyはしっかりとJSON形式になっています。

test.js

1var myPost = function(){ 2 3 const method = 'POST'; 4 //送信先を指定 5 const url = 'http://0.0.0.0:8000' 6 const headers = { 7 'Content-Type': 'application/x-www-form-urlencoded' 8 }; 9 // 送信データを変換 10 var min = 0 ; 11 var max = 10 ; 12 var random = Math.floor( Math.random() * (max + 1 - min) ) + min ; 13 14 var name = Math.random().toString(36).slice(-8); 15 16 const body = JSON.stringify({"name" : name, "id": random}) 17 18 const options = { 19 method, 20 headers, 21 mode: 'cors', 22 body 23 } 24 fetch(url, options) 25 .then(res => { 26 //成功時の処理 27 console.log("success") 28 console.log(res) 29 window.location.reload(); 30 }) 31 .catch(err => { 32 //エラー時の処理 33 console.log("false") 34 console.error 35 }) 36 return false; 37 }

JSコンソール

1Response {type: "cors", url: "http://0.0.0.0:8000", redirected: false, status: 200, ok: true, …} 2body:(...)
bodyUsed:false
headers:Headers {}
ok:true
redirected:false
status:200
statusText:"OK"
type:"cors"
url:"http://0.0.0.0:8000"
__proto__:Response


問題として、Javascript側でのfetch成功時にresの中身を出力してみるのですが、bodyの中身がカラになってしまい、JSON取得が失敗となってしまいます。

何が悪いのでしょうか?

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

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

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

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

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

guest

回答3

0

自己解決

.then(res => {
//成功時の処理
console.log("success")
console.log(res.body)
res.json().then(res => {
let data = res[0].name
console.log(data)
})
// window.location.reload();
})
このようにres.json().thenとすることでbodyを受け取ることができました。

投稿2018/09/19 16:13

GenkiMatsushima

総合スコア24

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

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

0

curlコマンド等で試してもできないですか?

投稿2018/09/19 11:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

guest

0

今環境が手元にないので試せておらず申し訳ないのですが、
さらっと読んでてここが気になりました。

'Content-Type': 'application/x-www-form-urlencoded'

JSON形式で送信しているのに FORM形式で送信しています。
ここをapplication/jsonに変えても駄目でしょうか?

投稿2018/09/19 01:56

編集2018/09/19 01:57
Kill_In_Sun

総合スコア40

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問