123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- package com.fdkankan.common.util;
- import lombok.extern.slf4j.Slf4j;
- import okhttp3.*;
- import org.springframework.util.CollectionUtils;
- import java.io.IOException;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- import java.util.concurrent.TimeUnit;
- import java.util.function.Consumer;
- //import org.springframework.http.HttpMethod;
- /**
- * @author axin
- * @since 2019-08-14
- */
- @Slf4j
- public class OkHttpUtils {
- // private static final Logger log = LoggerFactory.getLogger(OkHttpUtils.class);
- private static final String HTTP_JSON = "application/json; charset=utf-8";
- private static final String HTTP_FORM = "application/x-www-form-urlencoded; charset=utf-8";
- //MEDIA_TYPE_TEXT post请求不是application/x-www-form-urlencoded的,全部直接返回,不作处理,即不会解析表单数据来放到request parameter map中。所以通过request.getParameter(name)是获取不到的。只能使用最原始的方式,读取输入流来获取。
- private static final MediaType MEDIA_TYPE_TEXT = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");
- private static final OkHttpClient okHttpClient = new OkHttpClient.Builder()
- .connectTimeout(120, TimeUnit.SECONDS)
- .readTimeout(120, TimeUnit.SECONDS)
- .writeTimeout(120, TimeUnit.SECONDS)
- .build();
- /**
- * get请求
- * 对于小文档,响应体上的string()方法非常方便和高效。
- * 但是,如果响应主体很大(大于1 MB),则应避免string(),
- * 因为它会将整个文档加载到内存中。在这种情况下,将主体处理为流。
- *
- * @param url
- * @return
- */
- public static String httpGet(String url) {
- if (url == null || "".equals(url)) {
- log.error("url为null!");
- return "";
- }
- Request.Builder builder = new Request.Builder();
- Request request = builder.get().url(url).build();
- try {
- Response response = okHttpClient.newCall(request).execute();
- if (response.code() == 200) {
- log.info("http GET 请求成功; [url={}]", url);
- return response.body().string();
- } else {
- log.warn("Http GET 请求失败; [errorCode = {} , url={}]", response.code(), url);
- log.info(response.body().string());
- }
- } catch (IOException e) {
- throw new RuntimeException("同步http GET 请求失败,url:" + url, e);
- }
- return null;
- }
- public static String httpGet(String url, Map<String, String> headers) {
- if (CollectionUtils.isEmpty(headers)) {
- return httpGet(url);
- }
- Request.Builder builder = new Request.Builder();
- headers.forEach((String key, String value) -> builder.header(key, value));
- Request request = builder.get().url(url).build();
- try {
- Response response = okHttpClient.newCall(request).execute();
- if (response.code() == 200) {
- log.info("http GET 请求成功; [url={}]", url);
- return response.body().string();
- } else {
- log.warn("Http GET 请求失败; [errorxxCode = {} , url={}]", response.code(), url);
- }
- } catch (IOException e) {
- throw new RuntimeException("同步http GET 请求失败,url:" + url, e);
- }
- return null;
- }
- /**
- * @author xiaobu
- * @date 2019/3/4 15:58
- * @param url , params]
- * @return java.lang.String
- * @descprition post方式请求
- * @version 1.0
- */
- public static String sendByPostMap(String url, Map<String, String> params) {
- String result;
- OkHttpClient client = new OkHttpClient();
- StringBuilder content = new StringBuilder();
- Set<Map.Entry<String, String>> entrys = params.entrySet();
- Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
- while (iterator.hasNext()) {
- Map.Entry<String, String> entry = iterator.next();
- content.append(entry.getKey()).append("=").append(entry.getValue());
- if (iterator.hasNext()) {
- content.append("&");
- }
- }
- RequestBody requestBody = RequestBody.create(MEDIA_TYPE_TEXT, content.toString());
- Request request = new Request.Builder().url(url).post(requestBody).build();
- Response response = null;
- try {
- response = client.newCall(request).execute();
- assert response.body() != null;
- result = response.body().string();
- System.out.println("result = " + result);
- return result;
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 同步 POST调用 无Header
- *
- * @param url
- * @param json
- * @return
- */
- public static String httpPostJson(String url, String json) {
- if (url == null || "".equals(url)) {
- log.error("url为null!");
- return "";
- }
- MediaType JSON = MediaType.parse(HTTP_JSON);
- RequestBody body = RequestBody.create(JSON, json);
- Request.Builder requestBuilder = new Request.Builder().url(url);
- Request request = requestBuilder.post(body).build();
- try {
- Response response = okHttpClient.newCall(request).execute();
- if (response.code() == 200) {
- log.info("http Post 请求成功; [url={}, requestContent={}]", url, json);
- return response.body().string();
- } else {
- log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, json);
- }
- } catch (IOException e) {
- throw new RuntimeException("同步http请求失败,url:" + url, e);
- }
- return null;
- }
- /**
- * 同步 POST调用 有Header
- *
- * @param url
- * @param headers
- * @param json
- * @return
- */
- public static String httpPostJson(String url, Map<String, String> headers, String json) {
- if (CollectionUtils.isEmpty(headers)) {
- httpPostJson(url, json);
- }
- MediaType JSON = MediaType.parse(HTTP_JSON);
- RequestBody body = RequestBody.create(JSON, json);
- Request.Builder requestBuilder = new Request.Builder().url(url);
- headers.forEach((k, v) -> requestBuilder.addHeader(k, v));
- Request request = requestBuilder.post(body).build();
- try {
- Response response = okHttpClient.newCall(request).execute();
- if (response.code() == 200) {
- log.info("http Post 请求成功; [url={}, requestContent={}]", url, json);
- return response.body().string();
- } else {
- log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, json);
- }
- } catch (IOException e) {
- throw new RuntimeException("同步http请求失败,url:" + url, e);
- }
- return null;
- }
- /**
- * 提交表单
- * @param url
- * @param content
- * @param headers
- * @return
- */
- public static String postDataByForm(String url, String content, Map<String, String> headers) {
- MediaType JSON = MediaType.parse(HTTP_FORM);
- RequestBody body = RequestBody.create(JSON, content);
- Request.Builder requestBuilder = new Request.Builder().url(url);
- if (headers != null && headers.size() > 0) {
- headers.forEach((k, v) -> requestBuilder.addHeader(k, v));
- }
- Request request = requestBuilder
- .post(body)
- .build();
- Response response = null;
- try {
- response = okHttpClient.newCall(request).execute();
- if (response.code() == 200) {
- log.info("postDataByForm; [postUrl={}, requestContent={}, responseCode={}]", url, content, response.code());
- return response.body().string();
- } else {
- log.warn("Http Post Form请求失败,[url={}, param={}]", url, content);
- }
- } catch (IOException e) {
- log.error("Http Post Form请求失败,[url={}, param={}]", url, content, e);
- throw new RuntimeException("Http Post Form请求失败,url:" + url);
- }
- return null;
- }
- /**
- * 异步Http调用参考模板:Get、Post、Put
- * 需要异步调用的接口一般情况下你需要定制一个专门的Http方法
- *
- * @param httpMethod
- * @param url
- * @param content
- * @return
- */
- // @Deprecated
- // public static Future<Boolean> asyncHttpByJson(HttpMethod httpMethod, String url, Map<String, String> headers, String content) {
- // MediaType JSON = MediaType.parse(HTTP_JSON);
- // RequestBody body = RequestBody.create(JSON, content);
- //
- // Request.Builder requestBuilder = new Request.Builder()
- // .url(url);
- //
- // if (!CollectionUtils.isEmpty(headers)) {
- // headers.forEach((key, value) -> requestBuilder.header(key, value));
- // }
- //
- // switch (httpMethod) {
- // case GET:
- // requestBuilder.get();
- // break;
- // case POST:
- // requestBuilder.post(body);
- // break;
- // default:
- // }
- //
- // Request request = requestBuilder.build();
- // Call call = okHttpClient.newCall(request);
- // call.enqueue(new Callback() {
- // @Override
- // public void onFailure(Call call, IOException e) {
- // log.error("异步http {} 请求失败,[url={}, param={}]", httpMethod.name(), url, content);
- // throw new RuntimeException("异步http请求失败,url:" + url);
- // }
- //
- // @Override
- // public void onResponse(Call call, final Response response) throws IOException {
- // if (response.code() == 200) {
- // System.out.println("需要加入异步回调操作");
- // } else {
- // log.error("异步http {} 请求失败,错误码为{},请求参数为[url={}, param={}]", httpMethod.name(), response.code(), url, content);
- // }
- // }
- // });
- // return new AsyncResult(true);
- // }
- /**
- * lambda表达式异步调用http模板,不建议使用
- *
- * @param request
- * @param failure
- * @param respConsumer
- */
- public static void asyncCall(Request request, Consumer<Exception> failure, Consumer<Response> respConsumer) {
- okHttpClient.newCall(request).enqueue(new Callback() {
- @Override
- public void onFailure(Call call, IOException e) {
- failure.accept(e);
- }
- @Override
- public void onResponse(Call call, Response response) throws IOException {
- respConsumer.accept(response);
- }
- });
- }
- //test
- public static void main(String[] args) {
- // String url = "http://192.168.0.30:8000/pro";
- // JSONObject jsonObject = new JSONObject();
- // jsonObject.put("name", "vr-t-2KZ4MQv-001");
- // jsonObject.put("map", "t-2KZ4MQv");
- // jsonObject.put("resolution", 1024);
- // int num[] = new int[1];
- // num[0] = -1;
- // jsonObject.put("ids", num);
- // System.out.println(httpPostJson(url, jsonObject.toJSONString()));
- System.out.println(httpGet("http://192.168.0.165:8000/check"));
- }
- }
|