2012-10-01 2 views
-1

나는 끔찍한 명백한 것을 놓치고있는 것처럼 느껴진다. 그러나 나는 그것을 볼 수 없다. ipython에서 Django의 GET 요청에서 JSON 문자열을 어떻게 역 직렬화합니까?

(파이썬 2.7),이 작품 :

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

나는 실제 데이터로 이동하기 전에 내가 JSON을 읽을 수있는 자신을 설득, 장고보기에 해당하는 최소한의 예를 할 노력하고있어 구조 :

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

    return HttpResponse(parsed) 

내가

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

로 이동하여 브라우저에서 호출 내가를 얻을 수.

내가 뭘 잘못하고 어떻게 디버깅합니까? 어떤 종류의 인코딩 문제입니까? 또는 GET의 내용에 잘못 액세스하고 있습니까? 또는 다른 것?

나는 파일과 HttpResponse 모두 ​​변수 json_string을 덤프 해 보았습니다. 확인 벌금을 보이는 내가 '[]' 수 두 배 ...

편집 : 게시물을 디버깅하는 방법 궁금 다른 초보자의 이익을 위해

는 장고의 오류 페이지는 예외가 반환됩니다. 작동되는 빠르고 불쾌한 해킹은

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 
+0

'? json = []'은 어떻습니까? –

+0

oO POST를 사용하지 않는 이유는 무엇입니까? –

+0

@BasicWolf - 아니요. 테스트를 위해 더 간단 해 보였습니다. 클라이언트의 인코딩 된 URL을 잘라내어 브라우저에 직접 붙여 넣을 수 있습니다. POST가 더 나은 선택입니까? 왜? –

답변

3

JSON 문자열에 작은 따옴표를 포함 시켰습니다. JSON에서는 작은 따옴표가 유효하지 않기 때문에 특히 그럴 필요가 없습니다. http://localhost:8001/submit/?json=[]으로 가야합니다.

+0

좋습니다. 따라서 ipython 예제에서 작은 따옴표는 파이썬 문자열을 나타내지 만 GET 요청에서는 리터럴 문자로 전달됩니다. 맞습니까? –

+0

@ire_and_curses 예. 그렇습니다. 실제 JSON 데이터에 대해서는 POST를 사용하고있을 것입니다. 그렇습니까? –

+0

@ 존 클레멘트 - 물론 가능합니다. 그것을 선호하는 이유가 있습니까 (제가 이것에 대해 처음이라고 말할 수 있습니까?). –

2

테스트 목적으로도 GET이 더 쉬워 보이지만 JSON의 경우 POST 요청을 사용해야합니다. 요청이 응용 프로그램의 내부 상태를 변경하는 경우 매우 중요합니다. 예 : /localhost/format/?json={disk_id : 1}은 응용 프로그램의 상태를 변경하는 것입니다 :) 일반적으로 검색 엔진은 GET 요청 인 웹 사이트 링크를 색인합니다. 검색 엔진에 의해 인덱싱되는 링크를 상상해보십시오. 인덱싱 프로세스 중에도 응용 프로그램의 내부 상태가 변경 될 수 있습니다.

또 다른 이유는 웹 서버, 프록시 및 브라우저에서 구현되는 URL 캐싱 때문입니다. 그리고 GET 요청의 응답은 일반적으로 캐시 된 것입니다.

은하지 적어도 마지막으로, 요청 인수는 val's는 단일 값 데이터 필드가 아닌 JSON 데이터를 간단하기에 Query string

localhost?key1=val1&key2=val2 

형식이 될 것으로 예상된다 GET.

그래서 이유는 HTTP 프로토콜 설계에 있습니다. 예를 들어 AJAX 기술을 사용하여 JSON 데이터를 POST하면 위에서 설명한 모든 것을 피할 수 있습니다.

RESTful 웹 서비스 - 사용자 - 웹 응용 통신을 디자인하는 쉽고 강력한 개념 -에 대해 잘 알고있는 것이 좋습니다.

+0

감사합니다. 도움이됩니다. 또한 Firefox를 통해 사전 구성된 URL을 덤프 할 때 [글자 수 한도] (http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url)를 치는 것처럼 보입니다. 이제 POST로 전환했습니다. –

+0

향후 REST 초보자를 위해 GET과 비슷한 기능을 제공하는 POST 출력을 디버깅하는 간단한 방법을 찾았습니다. 내 편집을 참조하십시오. –

관련 문제