5159


Android のライブラリ Volley で JSON を POSTで送った後、Pythonで取り出せません。

### クライアント側 (Android )

[code]

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,url,jsonData,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
    
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
    
                    }
                });
    
[/code]

### サーバ側 (Python)

[code]

    import json
    import sys
    import cgi
    
    print "Content-Type: application/json\n"
    
    form = cgi.FieldStorage()
    print form
    
    myjson = json.load(sys.stdin)
    print myjson
    
[/code]

### 結果

[code]

    FieldStorage(None, None, '{"key":"value"}')
    
[/code]

### エラーログ

[code]

    Traceback (most recent call last):
      File "receive.py", line 20, in <module>
        myjson = json.load(sys.stdin)
      File "/usr/lib/python2.7/json/__init__.py", line 290, in load
        **kw)
      File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
        raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded
    
[/code]

`curl` で `-d "{'key':'value'}"` で渡しても同じでした。

データの送信自体はできているようなのですが、自由に使えるデータとして変数に格納するなど、取り出す方法がわかりません。回答よろしくお願いします。


CC BY-SA 3.0
2015-01-23T11:29:11.747
5155
2015-01-23T13:53:10.743
2015-01-23T11:42:03.680
4978
7733
question
android python json android-volley
Android Volley で送信した JSON データを、 Python(cgi) で受け取るには


`myjson = json.load(sys.stdin)`  
を  
`myjson = json.loads(sys.stdin)`  
にした場合はどうでしょうか？


CC BY-SA 3.0
2015-01-23T11:35:34.063
5156
2015-01-23T11:35:34.063
845
5155
answer


Androidからの受け渡し部分は省略して、 `curl -d`で実行した場合を仮定します。

`cgi.FieldStorage`を使用すると、`sys.stdin`を読み込んでしまっているので、`json.load(sys.stdin)`で取り出せるのは空文字列になります。

`curl -d`の引数が間違っていませんか？`"{'key':'value'}"`ではなく、`'{"key":"value"}'`として下さい。

[code]

    呼び出し:
    $ curl -d '{"key":"value"}' "http://example.com/execute.py"
    
    受け取り:
    # FieldStorageは削除して
    print json.load(sys.stdin)
    
[/code]


CC BY-SA 3.0
2015-01-23T13:53:10.743
5159
2015-01-23T13:53:10.743
6092
5155
answer