2013-03-30 8 views
0

AFHTTPClient를 사용하여 토네이도 서버에 연결하려고합니다. 서버 측에AttributeError : 객체에 'json_args'속성이 없습니다.

- (id)initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 
    if (!self) { 
     return nil; 
    } 


    [self setDefaultHeader:@"User-Agent" value:@"Client"]; 

    [self setDefaultHeader:@"Accept" value:@"application/json"]; 
    self.parameterEncoding = AFJSONParameterEncoding; 
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

짖는 소리 나는 설치 핸들러, :

class BaseHandler(tornado.web.RequestHandler): 
    @property 
    def db(self): 
     return self.application.db 

    def prepare(self): 
     if self.request.headers.get("Content-Type") == "application/json": 
      self.json_args = tornado.escape.json_decode(self.request.body) 

그런 다음이 핸들러의 서브 클래스를 구축 : 다음은 클라이언트에서 내 코드는

class TimelineHandler(BaseHandler): 
    def post(self): 
     user_id = self.json_args.get("user_id") 
     device_id = self.json_args.get("device_id") 
     token = self.json_args.get("token") 

     //do something with the request 

     self.write(response) 

그러나 때 이 코드를 실행하면 다음 오류 메시지와 함께 실패합니다.

HTTPRequest(protocol='http', host=<CORRECT URL HERE>, method='POST', uri='CORRECT URL HERE', version='HTTP/1.0', remote_ip='127.0.0.1', body='{"user_id":1,"device_id":"b9af8d9039ec1e527fecca70caf486e1","token":"36c9a0fe-2c4f-4273-9e12-0f855e05de87"}', headers={'Content-Length': '107', 'Accept-Language': 'en;q=1, fr;q=0.9, de;q=0.8, ja;q=0.7, nl;q=0.6, it;q=0.5', 'Accept-Encoding': 'gzip, deflate', 'X-Scheme': 'http', 'Host': 'CORRECT URL HERE', 'Accept': 'application/json', 'User-Agent': 'Client', 'Connection': 'close', 'X-Real-Ip': '58.246.153.177', **'Content-Type': 'application/json**; charset=utf-8'}) 
    Traceback (most recent call last): 
     File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1077, in _execute 
     *self.path_args, **self.path_kwargs) 
     File "/server.py", line 128, in post 
     user_id = self.json_args.get("user_id") 
    **AttributeError: 'TimelineHandler' object has no attribute 'json_args'** 

이상한 점은 요청 헤더에 분명히 'Content-Type': 'application/json'이 표시된다는 것입니다. 그렇다면 핸들러에 여전히 'json_args'속성이없는 이유는 무엇입니까?

토네이도 3.0을 사용하고 있습니다.

내게 조언을 해줄 수 있으면 정말 고마워.

답변

1

그것은이 컨텐츠 유형 설정에 의해 원인이 밝혀 다음 BaseHandler에

:

def prepare(self): 
     if self.request.headers.get("Content-Type") == "application/json": 
      self.json_args = tornado.escape.json_decode(self.request.body) 

그러나 실제로 요청 헤더 :

'콘텐츠 유형': ' application/json; charset = utf-8 '

이 문자열이 전혀 일치하지 않습니다. 그러나 Content-Type = "application/json"을 클라이언트에서 설정 한 후에도 문자열에 "; charset = utf-8"이 다시 추가됩니다.

def prepare(self): 
     if self.request.headers.get("Content-Type") == "application/json; charset=utf-8": 
      self.json_args = tornado.escape.json_decode(self.request.body) 

그것은 고정 내 문제 : 나는 이것을 해결하는 유일한 방법은에 basehandler 코드를 변경합니다. 하지만 여전히, "charset = utf-8"이 어디서 왔는지는 아무도 모른다. AFNetworking이 자동으로 설정합니까?

감사합니다.

+0

self.request.headers.get ("Content-Type")의 "application/json"이 인 경우 다음과 같이 입력 할 수 있습니다. 그러면 charset = utf-8이 정의되었는지 여부에 관계없이 일치합니다 –

관련 문제