HTTP是一個客戶端和服務器端請求和應答的標准(TCP),客戶端是終端用戶,服務器端是網站。通過使用Web瀏覽器、網絡爬蟲或者其它的工具,客戶端發起一個到服務器上指定端口(默認端口為80)的HTTP請求。
具體POST或GET實現代碼如下:
package com.yoodb.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; public class HttpConnectUtil { private static String DUOSHUO_SHORTNAME = "yoodb";//多說短域名 ****.yoodb.**** private static String DUOSHUO_SECRET = "xxxxxxxxxxxxxxxxx";//多說秘鑰 /** * get方式 * @param url * @author www.yoodb.com * @return */ public static String getHttp(String url) { String responseMsg = ""; HttpClient httpClient = new HttpClient(); GetMethod getMethod = new GetMethod(url); getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler()); try { httpClient.executeMethod(getMethod); ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream in = getMethod.getResponseBodyAsStream(); int len = 0; byte[] buf = new byte[1024]; while((len=in.read(buf))!=-1){ out.write(buf, 0, len); } responseMsg = out.toString("UTF-8"); } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //釋放連接 getMethod.releaseConnection(); } return responseMsg; } /** * post方式 * @param url * @param code * @param type * @author www.yoodb.com * @return */ public static String postHttp(String url,String code,String type) { String responseMsg = ""; HttpClient httpClient = new HttpClient(); httpClient.getParams().setContentCharset("GBK"); PostMethod postMethod = new PostMethod(url); postMethod.addParameter(type, code); postMethod.addParameter("client_id", DUOSHUO_SHORTNAME); postMethod.addParameter("client_secret", DUOSHUO_SECRET); try { httpClient.executeMethod(postMethod); ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream in = postMethod.getResponseBodyAsStream(); int len = 0; byte[] buf = new byte[1024]; while((len=in.read(buf))!=-1){ out.write(buf, 0, len); } responseMsg = out.toString("UTF-8"); } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { postMethod.releaseConnection(); } return responseMsg; } }
1、下面說一下多說單點登錄(SSO)獲取access_token訪問多說API的憑證。
多說單點登錄(SSO),授權結束后跳轉回在sso中設置的login地址,注意這時候的URL帶上了code參數,通過code獲取access_token訪問多說API的憑證,具體實現代碼如下:
public Map<String, String> getUserToken(String code){ String url = "http://api.duoshuo.com/oauth2/access_token"; String response = HttpConnectUtil.postHttp(url, code, "code"); System.out.println(response); Gson gson = new Gson(); Map<String, String> retMap = gson.fromJson(response,new TypeToken<Map<String, String>>() {}.getType()); return retMap; }
返回參數是一個JSON串,包含user_id和access_token,user_id是該用戶在多說的ID,access_token是訪問多說API的憑證,處理成Map集合方便使用。
2、如果獲取多說的用戶信息,根據上一步獲得的多說用戶user_id來獲取用戶的具體信息,詳情代碼如下:
public Map getProfiletMap(String userId){ String url = "http://api.duoshuo.com/users/profile.json?user_id="+userId; String response = HttpConnectUtil.getHttp(url); response = response.replaceAll("\\\\", ""); System.out.println(response); Gson gson = new Gson(); Map profile = gson.fromJson(response, Map.class); return profile; }
上述使用了Google處理json數據的jar,如果對Gson處理json數據的方式不很了解,參考地址:http://www.yoodb.com/article/display/1033
返回的數據格式如下:
{ "response": { "user_id": "13504206", "name": "傷了心", "url": "http://t.qq.com/wdg1115024292", "avatar_url": "http://q.qlogo.cn/qqapp/100229475/F007A1729D7BCC84C106D6E4F2ECC936/100", "threads": 0, "comments": 0, "social_uid": { "qq": "F007A1729D7BCC84C106D6E4F2ECC936" }, "post_votes": "0", "connected_services": { "qqt": { "name": "傷了心", "email": null, "avatar_url": "http://app.qlogo.cn/mbloghead/8a59ee1565781d099f3a/50", "url": "http://t.qq.com/wdg1115024292", "description": "沒勁", "service_name": "qqt" }, "qzone": { "name": "?郁悶小佈?", "avatar_url": "http://q.qlogo.cn/qqapp/100229475/F007A1729D7BCC84C106D6E4F2ECC936/100", "service_name": "qzone" } } }, "code": 0 }
獲取的用戶信息不方便查看,建議格式化一下,Json校驗或格式化地址:http://www.yoodb.com/toJson,返回數據參數說明:
code int 一定返回
結果碼。0為成功。失敗時為錯誤碼。
errorMessage strin
錯誤消息。當code不為0時,返回錯誤消息。
response object
json對象。當code為0時,返回請求到的json對象。