2013-03-30 29 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

原來,這是由Content-Type設置原因:

在BaseHandler:

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

但實際上在請求頭:

'的Content-Type':「應用/ JSON; charset = utf-8'

該字符串根本不匹配。但即使在客戶端設置了Content-Type =「application/json」之後,字符串再次附加了「; charset = utf-8」。我解決這個問題的唯一方法是將basehandler代碼更改爲:

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) 

它解決了我的問題。但是,仍然有人知道「charset = utf-8」來自哪裏?它是否由AFNetworking自動設置?

謝謝!

+0

你可以這樣做: if self.request.headers.get(「Content-Type」)中的「application/json」: 然後無論是否定義了charset = utf-8,它都會匹配 –

相關問題