2015-08-27 34 views
0

我已經編寫了一個服務,它將json作爲輸入。我正在使用網站hurl.it發送帖子請求進行檢查。下面是我的代碼片段:Tornado POST請求未檢測到作爲參數的json輸入

class BatchSemanticSimilarityHandler(tornado.web.RequestHandler): 
def post(self): 
    self.set_header('Access-Control-Allow-Origin', '*') 
    self.set_header('Access-Control-Allow-Credentials', 'true') 
    self.set_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') 
    self.set_header('Access-Control-Allow-Headers','Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token') 
    data = json.loads(self.request.body) 
    apikey = data["apikey"] 
    try: 
     UA = self.request.headers["User-Agent"] 
    except: 
     UA = "NA" 
    if bool(usercoll.find_one({"apikey":apikey})) == True: 
     sentence = data["sentence"] 
     sentence_array = data["sentence_array"] 
     n = data["num_of_results"]   
     if sentence is None or sentence_array is [] or apikey is None or n is None: 
      self.set_status(200) 
      output = {"error":[{"code":334,"message":"Bad Input data"}]} 
      misscoll.insert({"apitype":"batchsemanticsimilarity","timestamp":datetime.datetime.now(), "ip":self.request.remote_ip, "useragent":UA, "uri":self.request.uri,"apikey":apikey, "output":output, "input":{"s1":sentence,"s2":sentence_array}}) 
      self.write(output) 
      return 
     results = nb.get_similar(sentence, sentence_array, apikey, n) 
     print "results is",results 
     output = {"similar_sentences": results, 'credits':'ParallelDots'} 
     hitscoll.insert({"apitype":"batchsemanticsimilarity","timestamp":datetime.datetime.now(), "ip":self.request.remote_ip, "useragent":UA, "uri":self.request.uri,"apikey":apikey, "output":output, "input":{"s1":sentence,"s2":sentence_array}}) 
     self.write(output) 
     return 
    else: 
     rejectcoll.insert({"apitype":"batchsemanticsimilarity","apikey":apikey,"timestamp":datetime.datetime.now(), "ip":self.request.remote_ip, "useragent":UA, "url":self.request.uri}) 
     self.write({"error":[{"code":333,"message": "Bad Authentication data"}]}) 
     return 

,我給作爲請求的主體是下面的JSON:

{ 
"sentence": "BJP leads in Bengaluru civic body`s poll, all eyes on JD(S)", 
"sentence_array": [ 
    "Narendra Modi is the prime minister", 
    "Sonia Gandhi runs Congress", 
    "Sachin is a good batsman" 
], 
"apikey": "DyMe1gSNhvMV1I1b20a7KARYIwuQX5GAQ", 
"num_of_results": 2 
} 

我已經在jsonlint證實,這是一個有效的JSON。 但是發送請求它給了我下面的錯誤:

ValueError: No JSON object could be decoded 

誰能幫我整理了這一點!

回答

0

您在POST請求中傳遞的JSON對象被編碼到url中。 JSON庫無法讀取編碼的數據。因此,您需要先解碼網址。 url的解碼可以使用urlparse庫在python.so中完成,你需要這樣的東西。 post_data=urlparse.parse_qsl(self.request.body)

根據您的需要最終格式的閱讀中有urlparse.check各種方法this

如文檔指定您可以覆蓋的方法,使JSON解析

def prepare(self): if self.request.headers["Content-Type"].startswith("application/json"): self.json_args = json.loads(self.request.body) else: self.json_args = None

檢查this

+0

問題已解決!上面提到的解決方案並不是這裏的問題。 json被正確解析,因爲我從本地檢查了相同的代碼。這個問題是由於服務器上的端口封閉,我試圖通過nginx打到 – jyoti

+0

@jyoti如果你之前已經添加了這個,檢測它是服務器問題會很容易。我去解析問題看到錯誤。Anyway如果它的服務器關閉端口問題,爲什麼會有解析錯誤? –