Android 什么时候需要显式指定应用程序/json内容类型
目前,我正在构建一个Android移动应用程序&Python restful服务器服务 我发现,无论我是否使用Android 什么时候需要显式指定应用程序/json内容类型,android,python,rest,Android,Python,Rest,目前,我正在构建一个Android移动应用程序&Python restful服务器服务 我发现,无论我是否使用 self.response.headers['Content-Type'] = "application/json" 下面的代码(没有明确指定内容类型)适合我。我想知道,在什么情况下,我应该明确指定内容类型 Python restful服务器服务代码 Android移动应用程序客户端代码 内容类型指定响应内部的内容(即如何解释响应主体)。它是JSON、HTML文档、JPEG等吗?
self.response.headers['Content-Type'] = "application/json"
下面的代码(没有明确指定内容类型)适合我。我想知道,在什么情况下,我应该明确指定内容类型
Python restful服务器服务代码
Android移动应用程序客户端代码
内容类型
指定响应内部的内容(即如何解释响应主体)。它是JSON、HTML文档、JPEG等吗?当您有不同的资源表示形式时,它非常有用,并且与Accept
一起,它是在客户端和服务器之间执行操作所涉及的头
不同的客户端可能需要不同的格式。C#客户机可能更喜欢XML,Javascript客户机可能更喜欢JSON,另一个客户机可以使用多种表示法,但尝试先请求最有效的表示法,如果服务器无法为首选表示法提供服务,则选择其他表示法,等等
内容类型在浏览器中非常重要,以便用户代理知道如何显示响应。如果不指定一个,浏览器将尝试猜测,通常基于扩展名,如果失败,可能会返回到一些另存为…
对话框。在浏览器中,缺少内容类型
可能会导致某些HTML打开另存为…
对话框,或者PDF文件在页面中呈现为乱码
在应用程序客户端中,没有内容类型
可能会导致解析错误或被忽略。如果您的服务器只提供JSON,而您的客户机只需要JSON,那么您可以忽略内容类型
,客户机只会假定它是JSON,因为它是这样构建的
但是,如果在某个时候您想要添加XML作为表示,或者YAML或其他什么呢?然后您会遇到一个问题,因为客户端假定它始终是JSON,而忽略了内容类型
。现在,当它接收到XML时,它将尝试解析为JSON,但失败了。相反,如果客户机是基于内容类型构建的,而您总是指定内容类型
,那么您的客户机将考虑到这一点,并选择适当的解析器,而不是盲目地进行假设。这种方法有点模糊,我在我的一个项目中使用过它,但没有使用url.openConnection()……它起作用了。如果有人能给出详细的答案,我会很高兴的。
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;
}