package com.zehong.gassdevicereport.utils;

import com.zehong.gassdevicereport.result.Result;
import com.zehong.gassdevicereport.result.ResultEnum;
import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class HttpUtil {

    /**
     * get请求
     * @return
     */
    public static Result doGet(String url) throws IOException {
        HttpClient client = new DefaultHttpClient();
        //发送get请求
        HttpGet request = new HttpGet(url);
        HttpResponse response = client.execute(request);

        /**请求发送成功,并得到响应**/
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            /**读取服务器返回过来的json字符串数据**/
            String strResult = EntityUtils.toString(response.getEntity());
            return new Result(ResultEnum.SUCCESS.getCode(),strResult);
        }
        return new Result(ResultEnum.FAIL.getCode(),EntityUtils.toString(response.getEntity()));
    }

    /**
     * post请求(用于key-value格式的参数)
     * @param url
     * @param params
     * @return
     */
    public static Result doPost(String url, Map params) throws IOException, URISyntaxException {

        // 定义HttpClient
        HttpClient client = new DefaultHttpClient();
        // 实例化HTTP方法
        HttpPost request = new HttpPost();
        request.setURI(new URI(url));

        //设置参数
        List<NameValuePair> nvps = new ArrayList<>();
        for (Iterator iter = params.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String value = String.valueOf(params.get(name));
            nvps.add(new BasicNameValuePair(name, value));
        }
        request.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8));

        HttpResponse response = client.execute(request);
        int code = response.getStatusLine().getStatusCode();
        BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity()
                .getContent(),"utf-8"));
        StringBuffer sb = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");
        while ((line = in.readLine()) != null) {
            sb.append(line + NL);
        }
        in.close();
        //请求成功
        if(code == 200){
            return new Result(ResultEnum.SUCCESS.getCode(),sb.toString());
        }
        return new Result(ResultEnum.FAIL.getCode(),sb.toString());
    }

    /**
     * post请求(用于请求json格式的参数)
     * @param url
     * @param params
     * @return
     */
    public static Result doPost(String url, String params) throws Exception {

        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 创建httpPost
        HttpPost httpPost = new HttpPost(url);
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-Type", "application/json");
        String charSet = "UTF-8";
        StringEntity entity = new StringEntity(params, charSet);
        httpPost.setEntity(entity);
        CloseableHttpResponse response = null;
        try {
            response = httpclient.execute(httpPost);
            StatusLine status = response.getStatusLine();
            int state = status.getStatusCode();
            HttpEntity responseEntity = response.getEntity();
            String jsonString = EntityUtils.toString(responseEntity);
            if (state == HttpStatus.SC_OK) {
                return new Result(ResultEnum.SUCCESS.getCode(),jsonString);
            }
            return new Result(ResultEnum.FAIL.getCode(),jsonString);
        }finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
    }
}