Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么时候需要显式指定应用程序/json内容类型_Android_Python_Rest - Fatal编程技术网

Android 什么时候需要显式指定应用程序/json内容类型

Android 什么时候需要显式指定应用程序/json内容类型,android,python,rest,Android,Python,Rest,目前,我正在构建一个Android移动应用程序&Python restful服务器服务 我发现,无论我是否使用 self.response.headers['Content-Type'] = "application/json" 下面的代码(没有明确指定内容类型)适合我。我想知道,在什么情况下,我应该明确指定内容类型 Python restful服务器服务代码 Android移动应用程序客户端代码 内容类型指定响应内部的内容(即如何解释响应主体)。它是JSON、HTML文档、JPEG等吗?

目前,我正在构建一个Android移动应用程序&Python restful服务器服务

我发现,无论我是否使用

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;
}