使用 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