最近在使用Apache的httpclient的时候,maven引用了最新版本4.3,发现Idea提示DefaultHttpClient等常用的类已经不推荐使用了,之前在使用4.2.3版本的时候,还没有被deprecated。去看了下官方文档,确实不推荐使用了,点击此处详情。
- DefaultHttpClient —> CloseableHttpClient
- HttpResponse —> CloseableHttpResponse
官方给出了新api的样例,如下。
Get方法:
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
// The underlying HTTP connection is still held by the response object
// to allow the response content to be streamed directly from the network socket.
// In order to ensure correct deallocation of system resources
// the user MUST either fully consume the response content or abort request
// execution by calling CloseableHttpResponse#close().
//建立的http连接,仍旧被response1保持着,允许我们从网络socket中获取返回的数据
//为了释放资源,我们必须手动消耗掉response1或者取消连接(使用CloseableHttpResponse类的close方法)
try {
System.out.println(response1.getStatusLine());
HttpEntity entity1 = response1.getEntity();
// do something useful with the response body
// and ensure it is fully consumed
EntityUtils.consume(entity1);
} finally {
response1.close();
}
Post方法:
HttpPost httpPost = new HttpPost("http://targethost/login");
//拼接参数
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("username", "vip"));
nvps.add(new BasicNameValuePair("password", "secret"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
CloseableHttpResponse response2 = httpclient.execute(httpPost);
try {
System.out.println(response2.getStatusLine());
HttpEntity entity2 = response2.getEntity();
// do something useful with the response body
// and ensure it is fully consumed
//消耗掉response
EntityUtils.consume(entity2);
} finally {
response2.close();
}
再往下看HttpClients的源码,具体的实现都在HttpClientBuilder
的build
方法中,有兴趣的可以去apache看源码。
/**
* Creates {@link CloseableHttpClient} instance with default
* configuration.
*/
public static CloseableHttpClient createDefault() {
return HttpClientBuilder.create().build();
}
开发环境:Maven3.3.9
IDEA2016.2.1
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClientBuilder;
- import org.apache.http.util.EntityUtils;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Created by 清水66 on 2017/8/28.
- */
- public class JsonGet {
- public static void main(String[] args){
- //创建HttpClientBuilder
- HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
- //HttpClient
- CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
- HttpGet httpGet = new HttpGet(“http://android.myapp.com/myapp/app/comment.htm?apkName=com.youcash.ZYWallet&apkCode=157&p=1&fresh=0.02709822286851704&contextData=”);
- System.out.println(httpGet.getRequestLine());
- try {
- //执行get请求
- HttpResponse httpResponse = closeableHttpClient.execute(httpGet);
- //获取响应消息实体
- HttpEntity entity = httpResponse.getEntity();
- //响应状态
- System.out.println(“status:” + httpResponse.getStatusLine());
- //判断响应实体是否为空
- if (entity != null) {
- System.out.println(“contentEncoding:” + entity.getContentEncoding());
- parseJsonGet(EntityUtils.toString(entity));
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try { //关闭流并释放资源
- closeableHttpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- //解析Json数据
- public static void parseJsonGet(String jsonString){
- JSONObject jsonObject = JSONObject.fromObject(jsonString);
- //AppCommentsData类,存放评论的作者、评论内容等
- List<AppCommentsData> list = new ArrayList<AppCommentsData>();
- JSONObject obj= jsonObject.getJSONObject(“obj”);
- //商品评论信息
- JSONArray jsonArray = obj.getJSONArray(“commentDetails”);
- for(int i =0;i<jsonArray.size();i++){
- AppCommentsData appCommentsData = new AppCommentsData();
- appCommentsData.setApp_id(1);
- appCommentsData.setStore_id(1011);
- //评论作者
- appCommentsData.setAuthor(jsonArray.getJSONObject(i).getString(“nickName”));
- //商品评论内容
- appCommentsData.setData(jsonArray.getJSONObject(i).getString(“content”));
- //评分
- appCommentsData.setScore(jsonArray.getJSONObject(i).getInt(“score”));
- list.add(appCommentsData);
- }
- System.out.println(“输出appCommentsData//”);
- for (int i=0;i<list.size();i++){
- AppCommentsData appCommentsData = list.get(i);
- System.out.println(“name: =”+appCommentsData.getAuthor());
- System.out.println(“content: =”+appCommentsData.getData());
- System.out.println(“score: =”+appCommentsData.getScore());
- }
- }
- }
类AppCommentsData如下:
- /**
- * Created by 清水66 on 2017/8/22.
- */
- public class AppCommentsData {
- int id;
- int app_id;//app的id
- int store_id;//应用商店id
- String author;//评论人
- int score;//评分
- String data;//评论内容
- //生成getter.setter方法
- }
注意;1)在获取评论内容时,并把评论内容插入MySQL数据库时,由于评论内容有表情符号会报
Incorrect string value: ‘\xF0\x9F\x98\xAD”,…’
错误,
2)网络上建议把UTF-8改为utf8mb4,但是尝试了几个帖子上的操作没有成功,
3)本人把评论内容的表情去掉插入数据库中了
- String content = jsonArray.getJSONObject(i).getString(“content”).replaceAll(“[\\x{10000}-\\x{10FFFF}]”, “”);
- appCommentsData.setData(content);