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

top.jfunc.http.response.Response Maven / Gradle / Ivy

package top.jfunc.http.response;


import top.jfunc.http.base.HttpHeaders;
import top.jfunc.http.base.HttpStatus;
import top.jfunc.http.request.DownloadRequest;
import top.jfunc.http.SmartHttpClient;
import top.jfunc.common.string.FromString;
import top.jfunc.common.string.FromStringHandler;
import top.jfunc.common.utils.ArrayUtil;
import top.jfunc.common.utils.MapUtil;
import top.jfunc.common.utils.MultiValueMap;

import java.io.*;
import java.util.List;
import java.util.Objects;

/**
 * 面向使用者的代表请求的响应,封装statusCode、body、headers
 * 不提供对InputStream的直接支持,因为其需要手动处理资源释放
 * @author xiongshiyan at 2017/12/9
 */
public interface Response extends Closeable{
    /**
     * 获取响应码
     * @see HttpStatus
     * @return 响应码
     */
    int getStatusCode();

    /**
     * 响应的简短说明
     * @return 响应的简短说明
     */
    String getStatusText();

    /**
     * 响应体作为字节数组
     * @return byte[]
     */
    byte[] getBodyAsBytes();

    /**
     * 响应体编码,可以由{@link top.jfunc.http.request.HttpRequest}指定,
     * 也可以由响应头获取,由实现决定
     * @return 响应体编码
     */
    String getResultCharset();

    /**
     * 响应体
     * @return 以字符串返回响应体
     */
    default String getBodyAsString(){
        try {
            byte[] bytes = getBodyAsBytes();
            if(ArrayUtil.isEmpty(bytes)){
                return "";
            }
            return new String(bytes, getResultCharset());
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 此方法主要为了兼容性考虑
     * @return 响应体
     */
    default String getBody(){
        return getBodyAsString();
    }

    /**
     * 将返回结果直接转换为Java对象时使用此方法
     * @param toClass 转换的class
     * @param handler 将String转换为Java对象的策略接口
     * @return T
     */
    default  T as(Class toClass, FromStringHandler handler){
        FromStringHandler stringHandler = Objects.requireNonNull(handler , "handler不能为空");
        return stringHandler.as(getBodyAsString() , toClass);
    }
    default  T asT(Class toClass, FromString handler){
        FromString stringHandler = Objects.requireNonNull(handler , "handler不能为空");
        return stringHandler.as(getBodyAsString() , toClass);
    }

    /**
     * 建议不要使用此方法,会有效率上的折扣[InputStream->byte[]->InputStream->File],
     * 
     *     这是因为无法直接保存InputStream的引用,要么造成无法及时关闭,要么造成关闭了无法读取数据。
     * 
     *
     * 提供此方法的主要目的是在既想要将内容保存为文件,
     * 又需要header等信息的时候,返回Response代表响应的所有信息。
     * 如果只需要保存为文件,那么请调用 {@link SmartHttpClient#download(DownloadRequest)}
     *
     */
    default File asFile(File fileToSave) throws IOException{
        byte[] bodyBytes = getBodyAsBytes();
        if(ArrayUtil.isEmpty(bodyBytes)){
            return fileToSave;
        }
        try (FileOutputStream fileOutputStream = new FileOutputStream(fileToSave)){
            fileOutputStream.write(bodyBytes , 0 , bodyBytes.length);
            fileOutputStream.flush();
            return fileToSave;
        }
    }
    default File asFile(String fileName) throws IOException{
        return asFile(new File(fileName));
    }


    /**
     * 响应头,可能为空
     * @return MultiValueMap
     */
    MultiValueMap getHeaders();

    default List getHeader(String key){
        MultiValueMap headers = getHeaders();
        if(MapUtil.isEmpty(headers)){
            return null;
        }
        return headers.get(key);
    }
    default String getFirstHeader(String key){
        MultiValueMap headers = getHeaders();
        if(MapUtil.isEmpty(headers)){
            return null;
        }
        return headers.getFirst(key);
    }

    /**
     * 请求是否OK
     */
    default boolean isOk(){
        return HttpStatus.isOk(getStatusCode());
    }

    /**
     * 请求是否成功
     */
    default boolean isSuccess(){
        return HttpStatus.isSuccess(getStatusCode());
    }

    /**
     * 是否需要重定向
     */
    default boolean needRedirect(){
        return HttpStatus.needRedirect(getStatusCode());
    }

    /**
     * 获取重定向地址
     * @return 重定向地址
     */
    default String getRedirectUrl(){
        return this.getHeaders().getFirst(HttpHeaders.LOCATION);
    }

    @Override
    String toString();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy