使用Apache中的HttpClient的例項CloseableHttpClient進行http請求
對接咪咕音源場景重現:現在公司儲存音樂的id標識等資訊,不包含音樂url。想獲得音樂url,需要
和咪咕進行音源對接。根據咪咕提供的服務介面,實現業務對接。
首先,根據音樂id獲得url,需要拼裝url請求,再新增header頭部資訊。其中,url拼裝比較簡單,不再說。
下面詳細說下header資訊新增。
MiguHeader miguHeader = new MiguHeader(userInfo.getMemberPhone(), userAgent, miguxChannelCode, miguKey, url, networkType);
Map<String, String> header = Maps.newHashMap();
header.put(MiguMusicUtils.HEADER_XUPCAllINGLINEID, miguHeader.getxUpCallingLineID());
header.put(MiguMusicUtils.HEADER_USERAGENT, miguHeader.getUserAgent());
header.put(MiguMusicUtils.HEADER_XCHANNELCODE, miguHeader.getxChannelCode());
header.put(MiguMusicUtils.HEADER_XTIMESTAMP, miguHeader.getxTimestamp());
header.put(MiguMusicUtils.HEADER_XSIGNATURE, miguHeader.getxSignature());
header.put(MiguMusicUtils.HEADER_XUPBEARTYPE, miguHeader.getxUpBearType());
首先,將要新增的header資訊以map形式儲存。然後,使用HttpClient從客戶端傳送HTTP請求到伺服器端,
下面給出一個用HttpClient執行GET和POST請求的操作方法。
使用maven構建依賴包:
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId >httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
注意此httpClient包從4.4開始SSLContexts類就被移去了,我在使用4.3.1版本.其中的jar列表如下:
使用Apache的HttpClient傳送GET和POST請求的步驟如下:
1. 使用幫助類HttpClients建立CloseableHttpClient物件.
2. 基於要傳送的HTTP請求型別建立HttpGet或者HttpPost例項.
3. 使用addHeader方法新增請求頭部,諸如User-Agent, Accept-Encoding等引數.
4. 對於POST請求,建立NameValuePair列表,並新增所有的表單引數.然後把它填充進HttpPost
實體. (下面例子是get請求,沒有這項)
5. 通過執行此HttpGet或者HttpPost請求獲取CloseableHttpResponse例項
6. 從此CloseableHttpResponse例項中獲取狀態碼,錯誤資訊,以及響應頁面等等.
7. 最後關閉HttpClient資源.
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(getUrl.toString());
// 設定頭資訊
if (header != null) {
for (Map.Entry<String, String> entry : header.entrySet()) {
httpGet.addHeader(entry.getKey(), entry.getValue());
}
}
try {
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();//設定請求和傳輸超時時間
httpGet.setConfig(requestConfig);
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
HttpEntity entity = response.getEntity();
if (null != entity) {
StringBuilder sb = new StringBuilder();
InputStream in = entity.getContent();//將返回的內容流入輸入流內
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = "";
for (line = br.readLine(); line != null; line = br.readLine()) {
sb.append(line + "\n");
}
return sb.toString();
}
} finally {
response.close();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關閉連線,釋放資源
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
根據咪咕的文件,返回的字串是xml格式的,需要轉換成map。
public static Map<String, String> parseXml(String mingwenXml) {
Map<String, String> map = new HashMap<String, String>();
try {
StringReader sr = new StringReader(mingwenXml);
InputSource is = new InputSource(sr);
// 讀取輸入流
SAXReader reader = new SAXReader();
Document document = reader.read(is);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子節點
List<Element> elementList = root.elements();
// 遍歷所有子節點
for (Element e : elementList) {
map.put(e.getName(), e.getText());
}
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
最後將map給前臺就完成了。