All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dxy.library.network.http.builder.OkBuilder Maven / Gradle / Ivy

The newest version!
package com.dxy.library.network.http.builder;


import com.dxy.library.json.gson.GsonUtil;
import com.dxy.library.network.http.constant.Method;
import com.dxy.library.network.http.header.Headers;
import com.dxy.library.network.http.param.FileParam;
import com.dxy.library.network.http.param.Params;
import okhttp3.*;
import okhttp3.internal.Util;
import okio.BufferedSink;
import okio.ByteString;
import okio.Okio;
import okio.Source;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.List;

/**
 * 请求构建者基类
 * @author duanxinyuan
 * 2016/9/28 13:15
 */
public class OkBuilder extends Request.Builder {
    private static final MediaType MEDIA_TYPE_APPLICATION_JSON = MediaType.parse("application/json; charset=utf-8");
    private static final MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/*; charset=utf-8");
    private static final MediaType MEDIA_TYPE_OCTET_STREAM = MediaType.parse("application/octet-stream; charset=utf-8");

    public static  OkBuilder builder(Method method, String url, Headers headers, Params params, T t, List fileParams) {
        switch (method) {
            case GET:
                //GET不支持传输Body
                return GetBuilder.getBuilder().buildGet(url, headers, params);
            case POST:
                if (null != fileParams && fileParams.size() > 0) {
                    return PostBuilder.getBuilder().buildPost(url, headers, params, fileParams);
                } else {
                    if (null == t) {
                        return PostBuilder.getBuilder().buildPost(url, headers, params);
                    } else {
                        return PostBuilder.getBuilder().buildPost(url, headers, params, t, getMediaType(headers));
                    }
                }
            case PUT:
                if (null == t) {
                    return PutBuilder.getBuilder().buildPut(url, headers, params);
                } else {
                    return PutBuilder.getBuilder().buildPut(url, headers, params, t, getMediaType(headers));
                }
            case PATCH:
                if (null == t) {
                    return PatchBuilder.getBuilder().buildPatch(url, headers, params);
                } else {
                    return PatchBuilder.getBuilder().buildPatch(url, headers, params, t, getMediaType(headers));
                }
            case DELETE:
                //DELETE不支持传输Body
                return DeleteBuilder.getBuilder().buildDelete(url, headers, params);
            default:
                return null;
        }
    }

    private static MediaType getMediaType(Headers headers) {
        if (headers == null || !headers.containsContentType()) {
            return MEDIA_TYPE_APPLICATION_JSON;
        } else {
            return MediaType.parse(headers.getContentType());
        }
    }

     RequestBody getRequestBody(Headers headers, T t, MediaType type) {
        addHeader(headers);
        if (t instanceof String) {
            return RequestBody.create(type, (String) t);
        } else if (t instanceof byte[]) {
            return RequestBody.create(type, (byte[]) t);
        } else if (t instanceof ByteString) {
            return RequestBody.create(type, (ByteString) t);
        } else {
            return RequestBody.create(type, GsonUtil.to(t));
        }
    }

    RequestBody getRequestBody(Headers headers, Params params) {
        addHeader(headers);
        FormBody.Builder builder = new FormBody.Builder();
        addFormData(builder, params);
        return builder.build();
    }

    RequestBody getRequestBody(Headers headers, Params params, List fileParams) {
        addHeader(headers);
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        addFormDataPart(builder, params);
        if (fileParams != null && fileParams.size() > 0) {
            for (FileParam fileParam : fileParams) {
                addFormDataPart(builder, fileParam);
            }
        }
        return builder.build();
    }

    private void addFormDataPart(MultipartBody.Builder builder, FileParam fileParam) {
        if (null == fileParam) {
            return;
        }
        if (fileParam.getFile() != null) {
            RequestBody fileBody = RequestBody.create(guessMimeType(fileParam.getFileName()), fileParam.getFile());
            builder.addFormDataPart(fileParam.getName(), getHeaderValue(fileParam.getFileName()), fileBody);
        } else {
            RequestBody fileBody = getRequestBody(fileParam.getInputStream());
            builder.addFormDataPart(fileParam.getName(), getHeaderValue(fileParam.getFileName()), fileBody);
        }
    }

    private MediaType guessMimeType(String fileName) {
        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        String contentType = fileNameMap.getContentTypeFor(fileName);
        if (contentType == null) {
            return MEDIA_TYPE_OCTET_STREAM;
        } else {
            return MediaType.parse(contentType);
        }
    }

    private RequestBody getRequestBody(InputStream inputStream) {
        return new RequestBody() {
            @Override
            public MediaType contentType() {
                return MEDIA_TYPE_TEXT;
            }

            @Override
            public long contentLength() {
                try {
                    return inputStream.available();
                } catch (IOException e) {
                    return 0;
                }
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                Source source = null;
                try {
                    source = Okio.source(inputStream);
                    sink.writeAll(source);
                } finally {
                    Util.closeQuietly(source);
                }
            }
        };
    }

    /**
     * 添加Header
     */
    void addHeader(Headers headers) {
        if (null != headers && headers.size() > 0) {
            headers.forEach((key, value) -> {
                if (null != key && null != value) {
                    super.addHeader(getHeaderKey(key), getHeaderValue(value));
                }
            });
        }
    }

    /**
     * OkHttp的Header中的value不支持 null、\n和中文等特殊字符
     * 所以替换 \n ,再使用OkHttp的校验方式,校验不通过的话,就返回URL编码后的字符串
     */
    private static String getHeaderValue(String value) {
        String newValue = value.replace("\n", "");
        for (int i = 0, length = newValue.length(); i < length; i++) {
            char c = newValue.charAt(i);
            if ((c <= '\u001f' && c != '\t') || c >= '\u007f') {
                try {
                    return URLEncoder.encode(newValue, "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    return newValue;
                }
            }
        }
        return newValue;
    }

    /**
     * OkHttp的Header中的key不支持 null、\n和中文等特殊字符
     * 所以替换 \n ,再使用OkHttp的校验方式,校验不通过的话,就返回URL编码后的字符串
     */
    private static String getHeaderKey(String value) {
        String newValue = value.replace("\n", "");
        for (int i = 0, length = newValue.length(); i < length; i++) {
            char c = newValue.charAt(i);
            if (c <= '\u0020' || c >= '\u007f') {
                try {
                    return URLEncoder.encode(newValue, "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    return newValue;
                }
            }
        }
        return newValue;
    }

    private void addFormData(FormBody.Builder builder, Params params) {
        if (null != params && params.size() > 0) {
            params.forEach((k, v) -> {
                if (null != k && null != v) {
                    builder.add(k, v);
                }
            });
        }
    }

    private void addFormDataPart(MultipartBody.Builder builder, Params params) {
        if (null != params && params.size() > 0) {
            params.forEach((key, value) -> {
                if (null != key && null != value) {
                    builder.addFormDataPart(key, getHeaderValue(value));
                }
            });
        }
    }

    HttpUrl addQueryParameter(String url, Params params) {
        HttpUrl httpUrl = HttpUrl.parse(url);
        if (null != httpUrl && null != params && params.size() > 0) {
            HttpUrl.Builder builder = httpUrl.newBuilder();
            params.forEach((k, v) -> {
                if (null != k && null != v) {
                    builder.addQueryParameter(k, v);
                }
            });
            return builder.build();
        } else {
            return httpUrl;
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy