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

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

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

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

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

Q&A

解決済

3回答

15199閲覧

crulでPOSTするときのJSONのエラー(JSONDecodeError('Expecting value: line 1 column 1 (char 0))

trafalbad

総合スコア303

Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

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

0グッド

0クリップ

投稿2017/05/11 08:07

編集2017/05/11 08:47

単語をPOSTしてシリアライズした分類器で予測した結果を返すことを想定しています。

下記のcurlで単語をPOSTします。

curl http://localhost:8080/test.php -X POST -H "Content-Type: application/json" -d '{"building_name": "ライオンズガーデン明大○○○○"}'

その他にHTTPサーバをbottleで書いています。HTTPサーバ内ではPOSTする単語を前処理してシリアライズした分類器で予測できるように前処理する必要があります。従って、POSTで指定した単語を何らかの形で受け取る必要があります。

bottleで書いたHTTPサーバでは

request_json = json.loads(request.body.getvalue()) building_name = request_json['building_name']

という形でbuilding_nameに格納して使用しています。
しかしターミナルで実行し、指定されたURLに飛ぶと下記のエラーメッセージが出てしまいました。

JSONDecodeError('Expecting value: line 1 column 1 (char 0)',)

おそらくPOSTした単語をJSONで受け取る方法が間違っていると思われるのですが、この場合どのように解決したら良いでしょうか?
building_nameはテキストです。

HTTPサーバ内のコード

from bottle import route, run, request, HTTPResponse # -*- coding: utf-8 -*- import urllib.request import pandas as pd import numpy as np import matplotlib.pyplot as plt import json import csv import codecs from collections import OrderedDict from sklearn.externals import joblib #mecab from natto import MeCab nm = MeCab() print(nm) m = MeCab("-Owakati") MODEL_FILE='bays_model-2.csv' line=pd.read_csv("トレセ単語_new.csv") clf = joblib.load(MODEL_FILE) @route('/housmart', methods=['GET', 'POST']) def clean_name(): request_json = json.loads(request.body.getvalue()) building_name = request_json['building_name'] dek_dic={} dek_dic={v:i for i, v in enumerate(line.drop("Unnamed: 0", axis=1).columns.T)} def func(x): if x == None: return 1 else: return 0 # NaN are=[] for n in nm.parse(building_name, as_nodes=True): if n.surface !="": are.append(n.surface) ree=[] for i, v in dek_dic.items(): for n in are: if i==n: ree.append(v) else: pass were=[] for i,v in dek_dic.items(): if v in ree: were.append(None) else: were.append(i) xx=pd.DataFrame(were).applymap(func).T clf.predict(xx)#予測 if clf.predict(xx)==1: return str(building_name) run(host='localhost', port=8080, debug=True)

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

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

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

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

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

guest

回答3

0

ベストアンサー

ほかの方の回答とかぶりますが、まずは以下の例のように小さなところから一歩一歩進めると良いと思います。

サーバ

コード(server.py)

python

1from bottle import request, route, run 2 3@route('/housmart', method='POST') 4def clean_name(): 5 print(request.json['building_name']) 6 7run(host='localhost', port=8080, debug=True)

実行方法

ターミナルを1つ起動してスクリプトを実行します。

python server.py

実行結果

後述のクライアントを1回実行する毎に2行(クライアントから送ったデータとサーバが記録するアクセスログ)が追加されていきます。

Listening on http://localhost:8080/ Hit Ctrl-C to quit. test 127.0.0.1 - - [11/May/2017 14:20:59] "POST /housmart HTTP/1.1" 200 0

クライアント

実行方法

ターミナルをもう1つ起動して以下のように、まずは半角英数字のテキストを指定してコマンドを実行します。これが上手くいけば次に日本語を指定してみます。サーバ側の出力が化けるのであれば日本語のエンコーディング問題が次に解くべき課題です。

curl http://localhost:8080/housmart -X POST -H 'Content-Type: application/json' -d '{"building_name": "test"}'

投稿2017/05/11 14:39

編集2017/05/11 14:43
YouheiSakurai

総合スコア6142

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

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

trafalbad

2017/05/11 14:57

server.pyをターミナルで実行したのですが、 Method Not Allowed とエラーが出てしまいました。なぜこのようなエラーが生じてしまうのでしょうか?
YouheiSakurai

2017/05/11 15:08

server.pyをターミナルで実行しただけで出ますか?それともその後にクライアントを実行したときに出ますか?あとメッセージはサーバ、クライアントのどちらで表示されますか?
trafalbad

2017/05/11 18:33

ターミナルを実行した時に Listening on http://localhost:8080/ Hit Ctrl-C to quit. まで表示されて、上記URLにhousmartを足したページに飛ぶとサーバに表示されます。 よろしくお願いします。
trafalbad

2017/05/11 22:49

またメインのコードでrequest.json['building_name']を実行したところ下記エラーメッセージが出ましたが、単なる文字ではダメなのでしょうか? エラーメッセージ:NoneType' object is not callable
YouheiSakurai

2017/05/11 23:26

「上記URLにhousmartを足したページに飛ぶ」はブラウザでhttp://localhost:8080/housmartにアクセスしたという事でしょうか?server.pyはブラウザでアクセスしても大丈夫な作りにはなっていません。それがメッセージの理由です。 2つ目のコメントは何をして何がどうなったのか読み取れないので回答できません。
trafalbad

2017/05/12 01:28

できました!ありがとうございます。
guest

0

まず、

Python

1@route('/housmart', methods=['GET', 'POST'])

methods ではなくて method ですね。

次にbottleでは、Jsonを自力でParseしなくてもrequest.json が使えますよ。

ですので

Python

1 request_json = json.loads(request.body.getvalue()) 2 building_name = request_json['building_name']

の部分は

Python

1 building_name = request.json['building_name']

となります。

あと、 curlでPOSTするjsonデータは、ユニコードエスケープして送る必要があるかも知れません。(未確認)

curl http://localhost:8080/housmart -X POST -H "Content-Type: application/json" -d '{"building_name": "\u30e9\u30a4\u30aa\u30f3\u30ba\u30ac\u30fc\u30c7\u30f3\u660e\u5927\u25cb\u25cb\u25cb\u25cb"}'

投稿2017/05/11 09:20

編集2017/05/11 09:48
magichan

総合スコア15898

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

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

0

そもそもpostが間違っているような気がしますが・・・
※↓厳密には異なるので、イメージとして捉えてください

例を書くとGETだとこんな感じのURLを
(わかりやすくするためURLエンコードしてません)

http://localhost:8080/test.php?hoge={"building_name": "ライオンズガーデン明大○○○○"}

POSTで送る場合はこうなります。

curl http://localhost:8080/test.php -X POST -d 'hoge={"building_name": "ライオンズガーデン明大○○○○"}'

投稿2017/05/11 08:24

編集2017/05/11 08:27
shiroyuki

総合スコア169

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

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

trafalbad

2017/05/11 08:41

HTTPサーバを行ってからPOSTするのですがPOSTの前にHTTPサーバだけターミナルで行ってURLに飛ぶと上記エラーが出ます。POSTが間違っている以前に、エラーの原因としてPOSTで指定した単語をjson.loadsで受けとるコードの部分が間違っていると思うのですが、HTTPサーバ内でエラーの原因となる部分を教えてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問