功能:使用httpclient登陆百度账户访问开放平台获取POI数据
环境:httpclient: httpclient-3.1
开发工具:eclipse
引用的jar包:
引用
commons-httpclient-3.1.jar
commons-logging.jar
commons-codec-1.3.jar
java代码:
package org.qhy.test; import java.io.IOException; import java.net.URLEncoder; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; public class TestInvokeBaiduLogin { public static void main(String[] args) throws HttpException, IOException { // 创建httpClient客户端 HttpClient client = new HttpClient(); // 百度的登陆url String loginUrl = "https://passport.baidu.com/v2/api/?login"; // 设置代理 String httpProxyHost = "10.1.xx.xx"; int proxyPort = 1010; client.getHostConfiguration().setProxy(httpProxyHost, proxyPort); // 代理验证信息 client.getParams().setAuthenticationPreemptive(true); UsernamePasswordCredentials creds = new UsernamePasswordCredentials( "username", "password"); client.getState().setProxyCredentials(AuthScope.ANY, creds); // 代理设置结束(如果不需要代理这段可以注释掉) // 登陆百度 PostMethod psotMethod = new PostMethod(loginUrl); // 设置登陆参数 NameValuePair[] data = { new NameValuePair("class", "login"), new NameValuePair("tpl", "mn"), new NameValuePair("tangram", "true"), new NameValuePair("isPhone", "false"), new NameValuePair("loginType", "1"), new NameValuePair("token", "f6994339731518f4c50d30acc10cbc6f"), new NameValuePair("callback", "parent.bdPass.api.login._postCallback"), new NameValuePair("username", "xxxxx"), new NameValuePair("password", "xxx") }; psotMethod.setRequestBody(data); // HttpClient像浏览器一样接收 Cookie, client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); client.executeMethod(psotMethod); Header[] haeders = psotMethod.getRequestHeaders(); // 获取cookie Cookie[] cookies = client.getState().getCookies(); String cookiesStr = ""; for (Cookie c : cookies) { cookiesStr += c.toString() + ";"; } System.out.println("psotMethod--response:" + new String(psotMethod.getResponseBody(), "UTF-8")); psotMethod.releaseConnection(); // 使用 GET 方法 ,如果服务器需要通过 HTTPS 连接,那只需要将下面 URL 中的 http 换成 https HttpMethod method = new GetMethod( "http://api.map.baidu.com/place/v2/search?&q=" + URLEncoder.encode("饭店", "UTF-8") + "®ion=" + URLEncoder.encode("北京", "UTF-8") + "&output=json&ak=1649c026d0cea10ccf5741348526cb44"); method.setRequestHeader("Cookie", cookiesStr); method.getParams().setBooleanParameter( HttpMethodParams.SINGLE_COOKIE_HEADER, true); client.executeMethod(method); // 打印 服务器状态 System.out.println("状态:" + method.getStatusLine()); // 打印信息 System.out.println("内容:" + new String(method.getResponseBody(), "UTF-8")); // 关闭连接 method.releaseConnection(); } }
运行结果:
引用
2014-4-23 17:28:26 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
警告: Required credentials not available for BASIC <any realm>@api.map.baidu.com:80
2014-4-23 17:28:26 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
警告: Preemptive authentication requested but no default credentials available
状态:HTTP/1.0 200 OK
内容:{
"status":0,
"message":"ok",
"results":[
{
"name":"晚秋",
"location":{
"lat":39.963643,
"lng":116.328947
},
"address":"海淀区中关村南大街9号理工科技大厦1楼",
"street_id":"850815e174e4178243e19202",
"uid":"850815e174e4178243e19202"
},
{
"name":"蓝港饭庄",
"location":{
"lat":39.954199,
"lng":116.479906
},
"address":"北京市朝阳区朝阳公园路6号",
"street_id":"50fb64ffe16b1144e9f8536d",
"telephone":"(010)59056668,(010)59056663",
"uid":"50fb64ffe16b1144e9f8536d"
},
{
"name":"上庄水库(北岸韩式饭庄)",
"location":{
"lat":40.10668,
"lng":116.214358
},
"address":"上庄镇上庄水库大桥南岸往西400米",
"street_id":"f633606af167004d0b69d92b",
"telephone":"15801636650",
"uid":"f633606af167004d0b69d92b"
},
{
"name":"北京饭店",
"location":{
"lat":39.915258,
"lng":116.416697
},
"address":"北京市东城区东长安街33号",
"street_id":"b9e5d0b8a5ffcea581a12e38",
"telephone":"(010)65137766",
"uid":"b9e5d0b8a5ffcea581a12e38"
},
{
"name":"翠宫饭店(康乐部)",
"location":{
"lat":39.981772,
"lng":116.338918
},
"address":"海淀区知春路76号",
"street_id":"af1ae56b4fb679124207c14f",
"telephone":"(010)62628888",
"uid":"af1ae56b4fb679124207c14f"
},
{
"name":"北京特产(北京华夏明珠宾馆写字楼东)",
"location":{
"lat":39.901864,
"lng":116.32936
},
"address":"广莲路13号附近",
"street_id":"f1569f0df942537241d63e46",
"telephone":"63274484",
"uid":"f1569f0df942537241d63e46"
},
{
"name":"乔家大院(建外大街店)",
"location":{
"lat":39.911266,
"lng":116.449782
},
"address":"建华南路11号",
"street_id":"923ffd004ae07aaed92f283e",
"telephone":"(010)65661479",
"uid":"923ffd004ae07aaed92f283e"
},
{
"name":"西苑饭店",
"location":{
"lat":39.942936,
"lng":116.33884
},
"address":"北京市海淀区三里河路1号(近北京首都体育馆和北京动物园)",
"street_id":"eb3675036510d10201ec0197",
"telephone":"010-68313388,010-68314577",
"uid":"eb3675036510d10201ec0197"
},
{
"name":"世纪金源大饭店",
"location":{
"lat":39.959377,
"lng":116.287224
},
"address":"北京市北京海淀板井路69号",
"telephone":"(010)88598888,13901257698",
"uid":"1816533449feda1dfa2d619e"
},
{
"name":"Burberry(金茂北京威斯汀大饭店南)",
"location":{
"lat":39.955057,
"lng":116.466512
},
"address":"中国北京市朝阳区新源南路1号都汇天地首层L15号商铺",
"street_id":"dffd631c68351da538221c5a",
"telephone":"(010)84442261",
"uid":"dffd631c68351da538221c5a"
}
]
}