0

Raspberry Pi で温度データをログに記録し、これを自己ホスト型 RESTful API に投稿しようとしています。

API にデータを正常に投稿する際に問題が発生しています。コードは次のとおりです。

[rPi Python コード]

import urllib
import urllib2

url = 'http://doopcreations.com/raspberry/api/data'
params = urllib.urlencode({
  'item': 'temperature',
  'data': '25.00'
})

print("Posting data: " + params)

response = urllib2.urlopen(url, params).read()

print(response)

これにより、次のエラーが表示されます。

{"error":{"text":SQLSTATE[23000]: 整合性制約違反: 1048 列 'item' を null にすることはできません}}

注: また、NULL 値を許可するように DB を更新しようとしました。これにより、null 値のみが挿入されます。つまり、Python コードがデータを投稿していないようです.......

これを解決する方法についてのアイデアはありますか?

[アップデート]

「Chrome ウェブストア - 高度な REST クライアント」をテスト ツールとして使用する:

私が送信した場合:

{
  "item": "temperature",
  "data": "25.00"
}

ペイロードとして - POST が成功します。

ただし、送信した場合:

{
  'item': 'temperature',
  'data': '25.00'
}

ペイロードとして-エラーが発生します:

{"error":{"text":SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'item' cannot be null}}

--

4

1 に答える 1

1

「高度な REST クライアント」から送信しているデータは、本文として送信された JSON 文字列のようです。

Python コードから送信するデータは JSON ではなく、www-form-urlencoded です。

サービスを適切に記述していれば、サービスはリクエストの Content-Type を調べて、www-form-urlencoded データを適切に処理するか、その Content-Type が気に入らないというエラーを返します。代わりに、あなたのサービスは、JSON 以外は誰も送信しないと想定し、JSON の解析に失敗し、すべてに対して null 値を指定したと想定します。

したがって、サービスを修正する必要があります。

しかし一方で、壊れたサービスで動作するクライアントを作成したい場合は、作成できます。json.dumps(params)の代わりに電話する必要がありurllib.urlencode(params)ます。また、単線も使用できなくなりましたurlopen。このようなもの:

params = {
  'item': 'temperature',
  'data': '25.00'
}

r = urllib2.Request(url, json.dumps(params),
                    headers={'Content-Type': 'application/json'})
response = urllib2.urlopen(r).read()

third-party を使用してこれを少し単純化することもできますがrequests、この場合、stdlib の外に出る価値があるほどの違いはないと思います。基本的に、これの代わりに:

r = urllib2.Request(url, json.dumps(params),
                    headers={'Content-Type': 'application/json'})
response = urllib2.urlopen(r).read()

…あなたは…</p>

r = requests.post(url, data=json.dumps(params), 
                  headers={'Content-Type': 'application/json'})
response = r.text
于 2013-10-17T00:48:57.083 に答える