-1

ひどく明らかなものが欠けているような気がしますが、見えません。

ipython(Python 2.7)では、これは機能します:

In [1]: json.loads('[]')
Out[1]: []

実際のデータ構造に移る前にJSONを読み取れることを確信するために、Djangoビューで同等の最小限の例を実行しようとしています。

def submit(request):
    json_string = request.GET['json']
    parsed = json.loads(json_string)

    return HttpResponse(parsed)

ブラウザから次の場所にアクセスして呼び出します

http://localhost:8001/submit/?json='[]'

そして、私は得ValueError: No JSON object could be decodedます。

私は何を間違っているのですか、そしてそれをどのようにデバッグしますか?これはある種のエンコーディングの問題ですか?または、GETのコンテンツに誤ってアクセスしていますか?または、他の何か?

json_string変数をファイルとHttpResponseの両方にダンプしようとしました。どちらの場合も'[]'、それは確かにうまく見えます...

編集:

POSTをデバッグする方法を考えている他の初心者のために、Djangoのエラーページが例外で返されます。動作する迅速で厄介なハックは

import os
def debug_post(post_req):

    result = None
    try:
        result = submit_to_endpoint(post_req)
    except urllib2.URLError as e:
        out_fh = open('debug_post.tmp', 'w')
        out_fh.write(e.read())
        out_fh.close()
        os.system('firefox ' + 'debug.tmp')

    return result
4

2 に答える 2

3

JSON文字列に一重引用符を含めました。特に一重引用符はJSONでは無効であるため、その必要はありません。に行く必要がありhttp://localhost:8001/submit/?json=[]ます。

于 2012-10-01T11:44:18.387 に答える
2

GETはテスト目的でも簡単に思えるかもしれませんが、JSONの場合はPOSTリクエストを使用する必要があります。これは、リクエストがアプリケーションの内部状態を変更する場合に非常に重要です。たとえば/localhost/format/?json={disk_id : 1}、アプリケーションの状態を変更するものです:)通常、検索エンジンはGETリクエストであるWebサイトのリンクにインデックスを付けます。検索エンジンによってインデックスが作成されているようなリンクを想像してみてください。インデックス作成プロセス中であっても、アプリケーションの内部状態を変更できます。

もう1つの理由は、Webサーバー、プロキシ、およびブラウザーによって実装されたURLSキャッシングです。そして、何を推測するか、GETリクエストの応答は一般的にキャッシュされるものです。

大事なことを言い忘れましたが、GETリクエストの引数は単純にクエリ文字列に含まれていることが期待されます

localhost?key1=val1&key2=val2

format。ここでval's、はJSONデータではなく、単一値のデータフィールドです。

したがって、その理由はHTTPプロトコルの設計にあります。たとえば、AJAX手法を利用してJSONデータをPOSTできます。これで、上記のすべてを回避できます。

ユーザーからWebアプリへの通信を設計するための簡単で強力な概念であるRESTfulWebサービスの概念を理解することをお勧めします。

于 2012-10-01T13:34:04.633 に答える