想要调用第三方接口,就得进行第三方的登录验证。
hue的登录验证大概分为三步:
1.get请求:
加入username和password,请求之后,会返回一个sessionId。
2.拿第一次请求的sessionId在进行第二次的post登录请求,和第一次的请求路径一样,只是因为是post,在路径最后加/
然后sessionid 和 username 还有password作为参数
接下来就是重点代码,图一张,注:截图代码
public static Map<String, String> doPost(String url, Map<String,String> params) {
Map<String, String> map = new HashMap<String, String>();
BufferedReader in = null;
try {
CookieStore cookieStore = new BasicCookieStore();
// 定义HttpClient
HttpClient client = new DefaultHttpClient();
client = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
// 实例化HTTP方法
HttpPost request = new HttpPost();
request.setURI(new URI(url));
request.addHeader("Content-Type", "application/x-www-form-urlencoded");
request.addHeader("Cookie", "csrftoken=" + params.get("csrftoken") + "; sessionid=" + params.get("sessionId") + "; _gat=1");
request.addHeader("X-CSRFToken", "" + params.get("csrftoken") + "");
String encoding = DatatypeConverter
.printBase64Binary((params.get("username") + ":" + params.get("password")).getBytes(CHARSET));
request.setHeader("Authorization", "Basic " + encoding);
// 设置参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
for (Iterator iter = params.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String value = String.valueOf(params.get(name));
nvps.add(new BasicNameValuePair(name, value));
}
request.setEntity(new UrlEncodedFormEntity(nvps, CHARSET));
HttpResponse response = client.execute(request);
List<Cookie> cookies = cookieStore.getCookies();
//System.out.println("cppkies:"+cookies);
for(Cookie cookie:cookies){
System.out.println("cppkies:"+cookie);
}
for (int i = 0; i < cookies.size(); i++) {
if (cookies.get(i).getName().equals("sessionid")) {
map.put("sessionId", cookies.get(i).getValue());
}
if (cookies.get(i).getName().equals("csrftoken")) {
map.put("csrftoken", cookies.get(i).getValue());
}
}
int code = response.getStatusLine().getStatusCode();
if (code == 200) { // 请求成功
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), CHARSET));
StringBuffer sb = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
map.put("responseStr", sb.toString());
} else { //
System.out.println("状态码:" + code);
return map;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return map;
}
第二次会返回一个新的sessionId。也会有新的csrftoken。
3.之后的每次请求接口,在参数中把第二次获取的sessionID传过去就可以了。