2016-10-15 2 views
0

は、私が持っている単純化されたコードです:ユニコード値をurlfetchペイロードとして渡す方法は?ここ

#coding=utf-8 
... 

def api_call(method, token, params=[], payload=None): 
    ... 
    headers = { 
     'Content-Type': 'application/json; charset=utf-8' 
    } 
    try: 
     response = urlfetch.Fetch(url, headers=headers, method=urlfetch.POST, payload=payload, deadline=60) 
    ... 

payload = '{"search":"%s"}' % ('тест') # UNICODE HERE! 

result = api_call(method=method, token=MY_TOKEN, payload=payload) 

このコードはUnicode以外の文字でうまく動作しますが、ユニコードを使用した場合、私が取得:

File "/Users/me/Documents/Dev/GAE/app.py", line 38, in api_call 
    response = urlfetch.Fetch(url, headers=headers, method=urlfetch.POST, payload=payload, deadline=60) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 271, in fetch 
    return rpc.get_result() 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result 
    return self.__get_result_hook(self) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch.py", line 378, in _get_fetch_result 
    rpc.check_success() 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 579, in check_success 
    self.__rpc.CheckSuccess() 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_rpc.py", line 157, in _WaitImpl 
    self.request, self.response) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 201, in MakeSyncCall 
    self._MakeRealSyncCall(service, call, request, response) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 219, in _MakeRealSyncCall 
    request_pb.set_request(request.Encode()) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/net/proto/ProtocolBuffer.py", line 103, in Encode 
    self.Output(e) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/net/proto/ProtocolBuffer.py", line 347, in Output 
    self.OutputUnchecked(e) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/urlfetch_service_pb.py", line 478, in OutputUnchecked 
    out.putPrefixedString(self.payload_) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/net/proto/ProtocolBuffer.py", line 607, in putPrefixedString 
    v = str(v) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 92-93: ordinal not in range(128) 

ここで間違っていますか?

+0

Unicodeテキストをエンコードせずにネットワーク接続で送信することはできません。それを明示的にエンコードする。 –

+0

@MartijnPieters、ありがとう。私が 'urllib.quote(u'тест'.encode( 'utf-8'))'を実行すると例外はありませんが、サードパーティのサーバはurlでエンコードされたテキストが渡されたことを理解しません。 –

+0

そうかもしれませんが、エンコードせずにUnicodeテキストを送信しようとするのは解決策ではありません。 –

答えて

3

payload = '{"検索": "%s"}'ユニコードはここにあります!

これは、JSON直列化オブジェクトを作成するための良い方法ではありません。文字エンコーディングの問題とは別に、テンプレート文字列に引用符やバックスラッシュなどの文字列リテラルの特殊文字が含まれていると、問題が発生します。

search = u'тест' 
payload = json.dumps({'search': search}) 

「Content-Typeの」:直列化されたフォームを作成し、同時にエンコーディングの世話をするためにjsonモジュールを使用して提案する「アプリケーション/ JSON。文字セット= utf-8 '

application/jsonメディアタイプには、charsetパラメータはありません。これは何もしません。 JSONは常にUTFで、デフォルトではUTF-8です。

関連する問題