POSTでのcurlコマンドの使い方

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,746

trafalbad

score 217

curlコマンドからjsonを使用してhttpをPOSTしようと思っています。pythonのbottleを使おうと思っているのですが初心者のため、使い方が全くわかりません。

質問1:
Qiitaに以下のようなcurlコマンドがありましたが、これは何を表していて何をしているのでしょうか?

curl http://localhost:8080/test.php -X POST -H "Content-Type: application/json" -d '{"key": "value"}'

質問2:
ちなみにこれをanacondaで実装すると「invalid syntax」とのエラーが出ました。どこが間違っているのでしょうか?

質問3:
pythonのbottleでコマンドを書こうと思っているのですが、上の
{"key": "value"}でvalueをシリアライズした分類器にかけてreponseを受け取りたいのですが、上記のcurlコマンド以外に必要なjsonコマンドは何がありますか?

コード

from bottle import route, run
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import json
import csv
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'
clf = joblib.load(MODEL_FILE)

#前処理
f = open('baysweb_word.csv', 'r')
line = json.load(f)
dek_dic={}
dek_dic={v:i for i, v in enumerate(line.drop("Unnamed: 0", axis=1).columns)}
def func(x):
    if x == None:
        return 1
    else:
        return 0   # NaN

@route('/housmart', method="POST")
def clean_name():
    curl http://localhost:8080/housmart -X POST -H "Content-Type: application/json" -d '{"clean_buldingname": "ライオンズガーデン明大前パラダイム"}'
    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(clean_buildingname, 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(clean_buildingname)

run(host='localhost', port=8080, debug=True)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

  • curlはOSのコマンドでHTTPクライアント
  • bottleはPythonのライブラリでHTTPサーバ

この2点から物事を整理すると良いと思います。目的はcurlでPOSTリクエストを送る(HTTPクライアント機能)なのでbottleうんぬん、anacondaもPythonなので全て不要です。

多分curlとは何か、OSのコマンドとは何か、を調べてから「どのように実現するか」を考えていくと良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 00:16

    ターミナルでHTTPサーバへのリクエストをbottleで書いたファイル(HTTPサーバ)があります。それをターミナル上で実行するのと、ターミナルからcurlコマンドでPOSTリクエストを送る(HTTPクライアント)のは実行する順序があるのでしょうか?それとも全く別物なので、どちらか一つで完結するのでしょうか?
    ちなみに特定の単語をシリアライズしたベイズ分類器で予測することを想定しています、(単語を送る→予測結果を返す)

    キャンセル

  • 2017/05/11 00:36

    bottleで書いたHTTPサーバとcurlコマンドのHTTPクライアントは、全く別物なので別々に、手元で動かす時には普通、別々の2つのターミナル上で、1)サーバ、2)クライアントの順番に開始します。

    大切な事なので2度書きます。HTTPサーバとHTTPクライアントは、手元で動かす時には普通、別々の2つのターミナル上で、1)サーバ、2)クライアントの順番に開始します。

    「サーバ」とはリクエストを待ち受けるものなので先に開始する必要があります。「クライアント」とはリクエストを送るものなので後に開始する必要があります。

    あとbottleはリクエストを書くためのライブラリではなく、リクエストに応じたレスポンスを書くためのものです。「HTTPサーバへのリスエストをbottleで書」くことはありません。

    キャンセル

  • 2017/05/11 00:56

    大変よくわかりました!ありがとうございます!

    キャンセル

+1

質問1:
-X (GET、POSTなどの)メソッド。 -dを指定しているので自動でPOSTとして動作するはず。(省略してもよい)
-H 追加するHTTPヘッダ。送信データがjsonであることを示す。"Content-Type: application/json"
-d 送信データ
参考:WebAPIリクエスト仕様書としてcurlコマンドのご提案

質問2:
curlはシェル(ターミナル)コマンドなので、pythonコード内ではそのまま実行することはできません。
が、かわりにpycurlモジュールを利用することはできます。
参考:PycURLでHTTPリクエストあれこれ

質問3:
質問の意図・内容が理解できませんので、回答は控えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/10 17:40

    質問2に関してなんですが、ターミナル上で実行したところ同様のエラーが出ました。python内では実行できないとのことですが、つまりroute以下の関数内で実装せずに外で実装すればいいのでしょうか?
    コードは質問欄に記載し直しておきますのでよろしくお願いします。

    エラー
    File "bays.py", line 31
    curl http://localhost:8080/housmart -X POST -H "Content-Type: application/json" -d '{"clean_buldingname": "ライオンズガーデン明大前パラダイム"}'
    ^
    SyntaxError: invalid syntax

    キャンセル

  • 2017/05/10 17:44

    いやだからpythonコード内で書いてもだめですよ。「ls」とかと同じです。

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる