使用 Android URI.builder框架类,可以创建一个结构良好的URI。而不必担心URI组件的细节。

例如在查询参数之间添加&符号,并使用百分比跟字符代码编程无效字符。而且是的。

URL是URI的特定类,因此这可能让人有点困惑。在通过解析GITHUB__BASE__URL 字符串创建了我们的基本URI后,我们使用buildUpon方法创建一个Uri.builder,然后我们可以为搜索查询和排序字段调用appendQuery参数,

最后我们调用build方法来生成将用来查询GIthub的URI,但是这会生成一个Android Uri 而我们的方法需要一个Java URL ,我们可以将它作为字符串参数传递给Java URL 构造函数,将新建的Uri转换成Java URL 。

    final static String GITHUB_BASE_URL =
            "https://api.github.com/search/repositories";

    final static String PARAM_QUERY = "q";

    /*
     * The sort field. One of stars, forks, or updated.
     * Default: results are sorted by best match if no field is specified.
     */
    final static String PARAM_SORT = "sort";
    final static String sortBy = "stars";



Uri builtUri = Uri.parse(GITHUB_BASE_URL).buildUpon().appendQueryParameter(PARAM_QUERY, githubSearchQuery).appendQueryParameter(PARAM_SORT, sortBy).build();
URL url = null;
try{
    url = new URL(builtUri.toString());
}catch(MalformedURLException e){
    e.printStackTrace();
}

为了获得http连接,我们只需对URL调用openConnection.注意这实际上并不直接与网络交流,而只是创建http URL 连接对象。

在这一步,我们可以设置请求方法或者添加头字段,更改连接的属性。然后从openConnection 获得一个输入流,接下来我们需读取这个输入流的内容,在java中有很多进行读取的方法,但是我们选择使用扫描器,用它来令牌化流,因为这样更简单快速。

通过将分隔符设置为\A,即从流起点开始,我们强制扫描器将流的整个内容读入,下一个令牌流,这并不光明正大,但是它可自动为我们做一些事情。

    /**
     * This method returns the entire result from the HTTP response.
     *
     * @param url The URL to fetch the HTTP response from.
     * @return The contents of the HTTP response.
     * @throws IOException Related to network and stream reading
     */
    public static String getResponseFromHttpUrl(URL url) throws IOException {
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        try {
            InputStream in = urlConnection.getInputStream();

            Scanner scanner = new Scanner(in);
            scanner.useDelimiter("\\A");

            boolean hasInput = scanner.hasNext();
            if (hasInput) {
                return scanner.next();
            } else {
                return null;
            }
        } finally {
            urlConnection.disconnect();
        }
    }

它可以缓冲数据,这意味着它不仅以小块从网络中提取数据,而且由于http不需要向我们提供内容大小,我们的代码要准备好处理不同大小的缓冲区,而此代码能够根据需要自动分配和释放缓冲区,它还能帮我们处理字符编程,特别是它能将UTF-8(json和JavaScript的默认编程)转换成UTF-16(Android使用的格式)。

还有很多其他方式可以做到这一点,我们添加了一个栈溢出链接,你可以阅读了解它们,。

http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string

还有 一些非常棒的库,它们既可以简化Android网络连接,又能向http栈添加功能,我们添加了关于我们最喜欢的一个库的信息。okhttp

results matching ""

    No results matching ""