1. 程式人生 > >使用Apache中的HttpClient的例項CloseableHttpClient進行http請求

使用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列表如下:

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資源.

public static String doGetXml(String getUrl, Map<String, String> header) {
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給前臺就完成了。