在遵循Cloud Endpoints指南Creating an API with Cloud Endpoints Frameworks for App Engine之后,我尝试根据自己的需要稍微改变它:
class JSONResponse(messages.Message):
json_str = messages.StringField(1, repeated=False, required=True)
@endpoints.api(name='api', version='v1')
class JsonApi(remote.Service):
@endpoints.method(None, JSONResponse, http_method='POST', name='test')
def get_json(self, request):
tmp_json_obj = {"name":"me"}
tmp_json_str = json.dumps(tmp_json_obj)
return JSONResponse(json_str=tmp_json_str)
在Python shell中,json.dumps为键/值对返回一个"
的JSON字符串,并且'
包含整个字符串(良好,有效的JSON)。
>>> import json
>>> json.dumps({"name":"me"})
'{"name": "me"}'
在App Engine环境中,由于某种原因,整个字符串都包含在"
而不是'
中(错误,无效的JSON)。我在Google Stackdriver Logging中看到了这一点。
"{"name": "me"}"
我可以通过手动转义"
来解决这个问题:
...
tmp_json_str.replace('"','\\"')
return JSONResponse(json_str=tmp_json_str)
然后在客户端,使用JavaScript,我必须unescape "
unescapeQuotes: function(string) {
return string.replace(/\\"/g, '"');
}
这感觉很黑,所以我寻求更清洁的实施。
关于从云端点返回JSON的问题令人惊讶:How to return a json object in Google Endpoints。答案的重点是确保任何原始RPC消息定义良好并匹配它们封装的任何JSON 。
我同意这种方法很简洁,但如果像我一样,你不知道JSON的结构,因此只能提供一个非常基本的原型RPC消息来封装JSON字符串呢?