目前,我正在构建Android移动应用程序& Python restful服务器服务。
我发现,无论我是否正在使用
,它都没有什么不同self.response.headers['Content-Type'] = "application/json"
以下代码(明确没有具体的Content-Type)对我来说很好。我想知道,在什么情况下,我应该明确具体 Content-Type ?
class DebugHandler(webapp2.RequestHandler):
def get(self):
response = {}
response["key"] = "value"
self.response.out.write(json.dumps(response))
application = webapp2.WSGIApplication([
('/debug', DebugHandler),
], debug = True)
public static String getResponseBodyAsString(String request) {
BufferedReader bufferedReader = null;
try {
URL url = new URL(request);
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
initHttpURLConnection(httpURLConnection);
InputStream inputStream = httpURLConnection.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
int charRead = 0;
char[] buffer = new char[8*1024];
// Use StringBuilder instead of StringBuffer. We do not concern
// on thread safety. stringBuffer = new StringBuffer();
StringBuilder stringBuilder = new StringBuilder();
while ((charRead = bufferedReader.read(buffer)) > 0) {
stringBuilder.append(buffer, 0, charRead);
}
return stringBuilder.toString();
} catch (MalformedURLException e) {
Log.e(TAG, "", e);
} catch (IOException e) {
Log.e(TAG, "", e);
} finally {
close(bufferedReader);
}
return null;
}
答案 0 :(得分:1)
Content-Type
指定响应中的内容(即如何解释响应的主体)。它是JSON,HTML文档,JPEG等吗?当您对资源进行不同的表示时,它非常有用,并且与Accept
一起使用它是在客户端和服务器之间执行content negotiation时所涉及的标头。
不同的客户可能需要不同的格式。 AC#客户端可能更喜欢XML,Javascript客户端可能更喜欢JSON,另一个客户端可以使用多个表示但是尝试先请求最有效的表示,然后如果服务器无法为首选服务器提供服务,则等待其他客户端等等。
Content-Type
在浏览器中非常重要,因此用户代理知道如何显示响应。如果你没有指定一个,浏览器将尝试猜测,通常基于扩展名,如果失败也可能回退到某个Save as...
对话框。在浏览器中,缺少Content-Type
可能会导致某些HTML打开Save as...
对话框,或者PDF文件在页面中呈现为乱码。
在应用程序客户端中,没有Content-Type
可能会导致解析错误或可能会被忽略。如果您的服务器只提供JSON而您的客户端只需要JSON,那么您可以忽略Content-Type
,客户端将只假设它是JSON,因为它就是如何构建的。
但是,如果在某些时候你想要添加XML作为表示,或YAML或其他什么?然后你遇到了问题,因为客户端认为它始终是JSON而忽略了Content-Type
。现在,当它收到XML时,它将尝试解析为JSON并失败。相反,如果客户端是基于内容类型构建的,并且您始终指定Content-Type
,那么您的客户端将考虑它并选择适当的解析器而不是盲目地做出假设。