首先,一些背景:-我正在尝试解决最近面试官提出的一个问题。我必须编写代码并使用下面的 URL 来返回 JSON 响应 - https://losangeles.craigslist.org/
这就是我所做的:- 1)我创建了一个 Web 客户端并发出 HTTPURL 请求以获取 HTTP 响应。
public static JSONArray getSearchResults(String arg) {
JSONArray jsonArray = null;
try {
QueryString qs = new QueryString("query", arg);
URL url = new URL("https://toronto.craigslist.ca/search?"+qs);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/text");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String readAPIResponse = " ";
StringBuilder output = new StringBuilder();
while ((readAPIResponse = br.readLine()) != null) {
output.append(readAPIResponse);
}
jsonArray = convertToJson(output);
System.out.println(" JSON response : "+jsonArray.toString(2));
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return jsonArray;
}
2) 以下是将响应转换为 JSON 的函数:-
public static JSONArray convertToJson(StringBuilder response) {
JSONArray jsonArr = new JSONArray();
if (response != null) {
try {
Document document = Jsoup.parse(response.toString());
Elements resultRows = document.getElementsByClass("result-row");
JSONObject jsonObj;
for (int i = 0; i < resultRows.size(); i++) {
jsonObj = new JSONObject();
Element e = resultRows.get(i);
Elements resultsDate = e.getElementsByClass("result-date");
Elements resultsTitle = e.getElementsByClass("result-title hdrlnk");
String key1 = "date";
String value1 = resultsDate.get(0).text();
jsonObj.put(key1, value1);
String key2 = "title";
String value2 = resultsTitle.get(0).text();
jsonObj.put(key2, value2);
jsonArr.put(i, jsonObj);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return jsonArr;
}
我收到的响应是整个 HTML 页面(我使用邮递员提出请求)。因为,我只有几个小时来解决这个问题并且不知道如何解析整个 HTML,所以我最终使用了一个名为 JSoup 的第三方库。我对此不是 100% 满意,但最终别无选择。
我没有收到他们的回复,我很好奇这是否是最糟糕的方法,如果是,还有什么更好的选择?他们没有提到我可以使用什么技术。但是,由于我面试的技能集涉及 Java/J2EE,我正在考虑用 Java 来实现它(虽然不使用 Node js)谢谢!