Search in sources :

Example 1 with MappingParameter

use of com.dtflys.forest.mapping.MappingParameter in project forest by dromara.

the class ForestMethod method processParameters.

/**
 * 处理参数列表
 * @param parameters 参数数组,{@link Parameter}类数组实例
 * @param genericParamTypes 参数类型数组
 * @param paramAnns 参数注解的二维数组
 */
private void processParameters(Parameter[] parameters, Type[] genericParamTypes, Annotation[][] paramAnns) {
    for (int i = 0; i < parameters.length; i++) {
        Parameter param = parameters[i];
        Class paramType = param.getType();
        Annotation[] anns = paramAnns[i];
        MappingParameter parameter = new MappingParameter(paramType);
        parameter.setIndex(i);
        parameter.setName(param.getName());
        parameterTemplateArray[i] = parameter;
        if (OnSuccess.class.isAssignableFrom(paramType)) {
            onSuccessParameter = parameter;
            Type genType = genericParamTypes[i];
            onSuccessClassGenericType = getGenericClassOrType(genType, 0);
        } else if (OnError.class.isAssignableFrom(paramType)) {
            onErrorParameter = parameter;
        } else if (OnRedirection.class.isAssignableFrom(paramType)) {
            onRedirectionParameter = parameter;
        } else if (OnProgress.class.isAssignableFrom(paramType)) {
            onProgressParameter = parameter;
        } else if (OnSaveCookie.class.isAssignableFrom(paramType)) {
            onSaveCookieParameter = parameter;
        } else if (OnLoadCookie.class.isAssignableFrom(paramType)) {
            onLoadCookieParameter = parameter;
        }
        processParameterAnnotation(parameter, anns);
    }
}
Also used : ForestRequestType(com.dtflys.forest.http.ForestRequestType) ContentType(com.dtflys.forest.backend.ContentType) ForestDataType(com.dtflys.forest.utils.ForestDataType) MappingParameter(com.dtflys.forest.mapping.MappingParameter) MappingParameter(com.dtflys.forest.mapping.MappingParameter) ForestQueryParameter(com.dtflys.forest.http.ForestQueryParameter) OnError(com.dtflys.forest.callback.OnError) OnProgress(com.dtflys.forest.callback.OnProgress) Annotation(java.lang.annotation.Annotation) OnLoadCookie(com.dtflys.forest.callback.OnLoadCookie)

Example 2 with MappingParameter

use of com.dtflys.forest.mapping.MappingParameter in project forest by dromara.

the class ForestMethod method makeRequest.

/**
 * 创建请求
 * @param args 调用本对象对应方法时传入的参数数组
 * @return Forest请求对象,{@link ForestRequest}类实例
 */
private ForestRequest makeRequest(Object[] args) {
    MetaRequest baseMetaRequest = interfaceProxyHandler.getBaseMetaRequest();
    ForestURL baseURL = null;
    ForestQueryMap queries = new ForestQueryMap();
    if (baseUrlTemplate != null) {
        baseURL = baseUrlTemplate.render(args, queries);
    }
    if (urlTemplate == null) {
        throw new ForestRuntimeException("request URL is empty");
    }
    ForestURL renderedURL = urlTemplate.render(args, queries);
    ForestRequestType type = type(args);
    String baseContentEncoding = null;
    if (baseEncodeTemplate != null) {
        baseContentEncoding = baseEncodeTemplate.render(args);
    }
    String contentEncoding = null;
    if (encodeTemplate != null) {
        contentEncoding = encodeTemplate.render(args);
    }
    String baseContentType = null;
    if (baseContentTypeTemplate != null) {
        baseContentType = baseContentTypeTemplate.render(args);
    }
    String baseUserAgent = null;
    if (baseUserAgentTemplate != null) {
        baseUserAgent = baseUserAgentTemplate.render(args);
    }
    String charset = null;
    String renderedCharset = charsetTemplate.render(args);
    if (StringUtils.isNotBlank(renderedCharset)) {
        charset = renderedCharset;
    } else if (baseCharsetTemplate != null) {
        charset = baseCharsetTemplate.render(args);
    } else if (StringUtils.isNotBlank(configuration.getCharset())) {
        charset = configuration.getCharset();
    }
    String responseEncoding = null;
    if (responseEncodingTemplate != null) {
        responseEncoding = responseEncodingTemplate.render(args);
    }
    String sslProtocol = null;
    String renderedSslProtocol = sslProtocolTemplate.render(args);
    if (StringUtils.isNotBlank(renderedSslProtocol)) {
        sslProtocol = renderedSslProtocol;
    } else if (baseSslProtocolTemplate != null) {
        sslProtocol = baseSslProtocolTemplate.render(args);
    } else {
        sslProtocol = configuration.getSslProtocol();
    }
    String renderedContentType = null;
    if (contentTypeTemplate != null) {
        renderedContentType = contentTypeTemplate.render(args).trim();
    }
    String renderedUserAgent = null;
    if (userAgentTemplate != null) {
        renderedUserAgent = userAgentTemplate.render(args).trim();
    }
    List<RequestNameValue> nameValueList = new ArrayList<>();
    String[] headerArray = baseMetaRequest.getHeaders();
    MappingTemplate[] baseHeaders = null;
    if (headerArray != null && headerArray.length > 0) {
        baseHeaders = new MappingTemplate[headerArray.length];
        for (int j = 0; j < baseHeaders.length; j++) {
            MappingTemplate header = new MappingTemplate(BaseRequest.class, "headers", this, headerArray[j], this, configuration.getProperties(), forestParameters);
            baseHeaders[j] = header;
        }
    }
    AddressSource addressSource = configuration.getBaseAddressSource();
    ForestAddress address = configuration.getBaseAddress();
    if (address == null) {
        // 默认根地址
        address = DEFAULT_ADDRESS;
    }
    ForestURL addressURL = null;
    if (baseURL != null) {
        renderedURL.setBaseURL(baseURL);
    }
    try {
        addressURL = new ForestURL(new URL("http://localhost"));
        addressURL.setBaseAddress(address);
        renderedURL = renderedURL.mergeURLWith(addressURL);
    } catch (MalformedURLException e) {
        throw new ForestRuntimeException(e);
    }
    boolean autoRedirection = configuration.isAutoRedirection();
    String bodyTypeName = "text";
    if (bodyTypeTemplate != null) {
        bodyTypeName = bodyTypeTemplate.render(args);
    }
    ForestDataType bodyType = ForestDataType.findByName(bodyTypeName);
    // createExecutor and initialize http instance
    ForestRequest<T> request = new ForestRequest(configuration, this, args);
    request.url(renderedURL).type(type).bodyType(bodyType).addAllQuery(queries).charset(charset).autoRedirects(autoRedirection).setSslProtocol(sslProtocol).setLogConfiguration(logConfiguration).setAsync(async);
    if (addressSource != null) {
        address = addressSource.getAddress(request);
        request.address(address);
    }
    if (StringUtils.isNotEmpty(responseEncoding)) {
        request.setResponseEncode(responseEncoding);
    }
    if (StringUtils.isNotEmpty(renderedContentType)) {
        request.setContentType(renderedContentType);
    }
    if (StringUtils.isNotEmpty(contentEncoding)) {
        request.setContentEncoding(contentEncoding);
    }
    if (StringUtils.isNotEmpty(renderedUserAgent)) {
        request.setUserAgent(renderedUserAgent);
    }
    for (int i = 0; i < namedParameters.size(); i++) {
        MappingParameter parameter = namedParameters.get(i);
        if (parameter.isObjectProperties()) {
            int target = parameter.isUnknownTarget() ? type.getDefaultParamTarget() : parameter.getTarget();
            Object obj = args[parameter.getIndex()];
            if (obj == null && StringUtils.isNotEmpty(parameter.getDefaultValue())) {
                obj = parameter.getConvertedDefaultValue(configuration.getJsonConverter());
            }
            if (parameter.isJsonParam()) {
                String json = "";
                if (obj != null) {
                    ForestJsonConverter jsonConverter = configuration.getJsonConverter();
                    obj = parameter.getFilterChain().doFilter(configuration, obj);
                    json = jsonConverter.encodeToString(obj);
                }
                if (MappingParameter.isHeader(target)) {
                    request.addHeader(new RequestNameValue(parameter.getJsonParamName(), json, target).setDefaultValue(parameter.getDefaultValue()));
                } else {
                    nameValueList.add(new RequestNameValue(parameter.getJsonParamName(), json, target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue()));
                }
            } else if (!parameter.getFilterChain().isEmpty()) {
                obj = parameter.getFilterChain().doFilter(configuration, obj);
                if (obj == null && StringUtils.isNotEmpty(parameter.getDefaultValue())) {
                    obj = parameter.getDefaultValue();
                }
                if (obj != null) {
                    if (MappingParameter.isHeader(target)) {
                        request.addHeader(new RequestNameValue(null, obj, target));
                    } else if (MappingParameter.isQuery(target)) {
                        request.addQuery(obj.toString(), (Object) null, parameter.isUrlEncode(), parameter.getCharset());
                    } else if (MappingParameter.isBody(target)) {
                        ForestRequestBody body = RequestBodyBuilder.type(obj.getClass()).build(obj, parameter.getDefaultValue());
                        request.addBody(body);
                    } else {
                        nameValueList.add(new RequestNameValue(obj.toString(), target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue()));
                    }
                }
            } else if (obj instanceof CharSequence) {
                if (MappingParameter.isQuery(target)) {
                    request.addQuery(ForestQueryParameter.createSimpleQueryParameter(obj).setDefaultValue(parameter.getDefaultValue()));
                } else if (MappingParameter.isBody(target)) {
                    request.addBody(new StringRequestBody(obj.toString()).setDefaultValue(parameter.getDefaultValue()));
                }
            } else if (obj instanceof Map) {
                Map map = (Map) obj;
                if (MappingParameter.isQuery(target)) {
                    request.addQuery(map, parameter.isUrlEncode(), parameter.getCharset());
                } else if (MappingParameter.isBody(target)) {
                    request.addBody(map, parameter.getPartContentType());
                } else if (MappingParameter.isHeader(target)) {
                    request.addHeader(map);
                }
            } else if (obj instanceof Iterable || (obj != null && (obj.getClass().isArray() || ReflectUtils.isPrimaryType(obj.getClass())))) {
                if (MappingParameter.isQuery(target)) {
                    if (parameter.isJsonParam()) {
                        request.addQuery(parameter.getName(), obj, parameter.isUrlEncode(), parameter.getCharset());
                    } else {
                        if (obj instanceof Iterable) {
                            for (Object subItem : (Iterable) obj) {
                                if (subItem instanceof ForestQueryParameter) {
                                    request.addQuery((ForestQueryParameter) subItem);
                                } else {
                                    request.addQuery(ForestQueryParameter.createSimpleQueryParameter(subItem));
                                }
                            }
                        } else if (obj.getClass().isArray()) {
                            if (obj instanceof ForestQueryParameter[]) {
                                request.addQuery((ForestQueryParameter[]) obj);
                            }
                        }
                    }
                } else if (MappingParameter.isBody(target)) {
                    ForestRequestBody body = RequestBodyBuilder.type(obj.getClass()).build(obj, parameter.getDefaultValue());
                    request.addBody(body);
                }
            } else if (MappingParameter.isBody(target)) {
                ForestRequestBody body = RequestBodyBuilder.type(obj.getClass()).build(obj, parameter.getDefaultValue());
                request.addBody(body);
            } else {
                try {
                    List<RequestNameValue> list = getNameValueListFromObjectWithJSON(parameter, configuration, obj, type);
                    for (RequestNameValue nameValue : list) {
                        if (nameValue.isInHeader()) {
                            request.addHeader(nameValue);
                        } else {
                            nameValueList.add(nameValue);
                        }
                    }
                } catch (Throwable th) {
                    throw new ForestRuntimeException(th);
                }
            }
        } else if (parameter.getIndex() != null) {
            int target = parameter.isUnknownTarget() ? type.getDefaultParamTarget() : parameter.getTarget();
            RequestNameValue nameValue = new RequestNameValue(parameter.getName(), target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue());
            Object obj = args[parameter.getIndex()];
            if (obj == null && StringUtils.isNotEmpty(nameValue.getDefaultValue())) {
                obj = parameter.getConvertedDefaultValue(configuration.getJsonConverter());
            }
            if (obj != null) {
                if (MappingParameter.isQuery(target) && obj.getClass().isArray() && !(obj instanceof byte[]) && !(obj instanceof Byte[])) {
                    int len = Array.getLength(obj);
                    for (int idx = 0; idx < len; idx++) {
                        Object arrayItem = Array.get(obj, idx);
                        ForestQueryParameter queryParameter = new ForestQueryParameter(parameter.getName(), arrayItem, parameter.isUrlEncode(), parameter.getCharset());
                        request.addQuery(queryParameter);
                    }
                } else {
                    nameValue.setValue(obj);
                    if (MappingParameter.isHeader(target)) {
                        request.addHeader(nameValue);
                    } else if (MappingParameter.isQuery(target)) {
                        if (!parameter.isJsonParam() && obj instanceof Iterable) {
                            int index = 0;
                            MappingTemplate template = makeTemplate(parameter);
                            VariableScope parentScope = template.getVariableScope();
                            for (Object subItem : (Iterable) obj) {
                                SubVariableScope scope = new SubVariableScope(parentScope);
                                scope.addVariableValue("_it", subItem);
                                scope.addVariableValue("_index", index++);
                                template.setVariableScope(scope);
                                String name = template.render(args);
                                request.addQuery(name, subItem, parameter.isUrlEncode(), parameter.getCharset());
                            }
                        } else if (parameter.isJsonParam()) {
                            request.addJSONQuery(parameter.getName(), obj);
                        } else {
                            request.addQuery(parameter.getName(), obj, parameter.isUrlEncode(), parameter.getCharset());
                        }
                    } else {
                        MappingTemplate template = makeTemplate(parameter);
                        if (obj instanceof Iterable && template.hasIterateVariable()) {
                            int index = 0;
                            VariableScope parentScope = template.getVariableScope();
                            for (Object subItem : (Iterable) obj) {
                                SubVariableScope scope = new SubVariableScope(parentScope);
                                template.setVariableScope(scope);
                                scope.addVariableValue("_it", subItem);
                                scope.addVariableValue("_index", index++);
                                String name = template.render(args);
                                nameValueList.add(new RequestNameValue(name, subItem, target, parameter.getPartContentType()).setDefaultValue(parameter.getDefaultValue()));
                            }
                        } else {
                            nameValueList.add(nameValue);
                        }
                    }
                }
            }
        }
    }
    if (request.getContentType() == null) {
        if (StringUtils.isNotEmpty(baseContentType)) {
            request.setContentType(baseContentType);
        }
    }
    if (request.getContentEncoding() == null) {
        if (StringUtils.isNotEmpty(baseContentEncoding)) {
            request.setContentEncoding(baseContentEncoding);
        }
    }
    if (request.getUserAgent() == null) {
        if (StringUtils.isNotEmpty(baseUserAgent)) {
            request.setUserAgent(baseUserAgent);
        }
    }
    List<ForestMultipart> multiparts = new ArrayList<>(multipartFactories.size());
    String contentType = request.getContentType();
    if (!multipartFactories.isEmpty()) {
        if (StringUtils.isBlank(contentType)) {
            String boundary = StringUtils.generateBoundary();
            request.setContentType(ContentType.MULTIPART_FORM_DATA + "; boundary=" + boundary);
        } else if (ContentType.MULTIPART_FORM_DATA.equalsIgnoreCase(contentType) && request.getBoundary() == null) {
            request.setBoundary(StringUtils.generateBoundary());
        }
    }
    for (int i = 0; i < multipartFactories.size(); i++) {
        ForestMultipartFactory factory = multipartFactories.get(i);
        MappingTemplate nameTemplate = factory.getNameTemplate();
        MappingTemplate fileNameTemplate = factory.getFileNameTemplate();
        int index = factory.getIndex();
        Object data = args[index];
        factory.addMultipart(nameTemplate, fileNameTemplate, data, multiparts, args);
    }
    request.setMultiparts(multiparts);
    // setup ssl keystore
    if (sslKeyStoreId != null) {
        SSLKeyStore sslKeyStore = null;
        String keyStoreId = sslKeyStoreId.render(args);
        if (StringUtils.isNotEmpty(keyStoreId)) {
            sslKeyStore = configuration.getKeyStore(keyStoreId);
            request.setKeyStore(sslKeyStore);
        }
    }
    if (encoder != null) {
        request.setEncoder(encoder);
    }
    if (decoder != null) {
        request.setDecoder(decoder);
    }
    if (progressStep >= 0) {
        request.setProgressStep(progressStep);
    }
    if (configuration.getDefaultParameters() != null) {
        request.addNameValue(configuration.getDefaultParameters());
    }
    if (baseHeaders != null && baseHeaders.length > 0) {
        for (MappingTemplate baseHeader : baseHeaders) {
            String headerText = baseHeader.render(args);
            String[] headerNameValue = headerText.split(":", 2);
            if (headerNameValue.length > 1) {
                String name = headerNameValue[0].trim();
                if (request.getHeader(name) == null) {
                    request.addHeader(name, headerNameValue[1].trim());
                }
            }
        }
    }
    if (configuration.getDefaultHeaders() != null) {
        request.addHeaders(configuration.getDefaultHeaders());
    }
    List<RequestNameValue> dataNameValueList = new ArrayList<>();
    renderedContentType = request.getContentType();
    if (renderedContentType == null || renderedContentType.equalsIgnoreCase(ContentType.APPLICATION_X_WWW_FORM_URLENCODED)) {
        for (int i = 0; i < dataTemplateArray.length; i++) {
            MappingTemplate dataTemplate = dataTemplateArray[i];
            String data = dataTemplate.render(args);
            String[] paramArray = data.split("&");
            for (int j = 0; j < paramArray.length; j++) {
                String dataParam = paramArray[j];
                String[] dataNameValue = dataParam.split("=", 2);
                if (dataNameValue.length > 0) {
                    String name = dataNameValue[0].trim();
                    RequestNameValue nameValue = new RequestNameValue(name, type.getDefaultParamTarget());
                    if (dataNameValue.length == 2) {
                        nameValue.setValue(dataNameValue[1].trim());
                    }
                    nameValueList.add(nameValue);
                    dataNameValueList.add(nameValue);
                }
            }
        }
    } else {
        for (int i = 0; i < dataTemplateArray.length; i++) {
            MappingTemplate dataTemplate = dataTemplateArray[i];
            String data = dataTemplate.render(args);
            request.addBody(data);
        }
    }
    request.addNameValue(nameValueList);
    for (int i = 0; i < headerTemplateArray.length; i++) {
        MappingTemplate headerTemplate = headerTemplateArray[i];
        String header = headerTemplate.render(args);
        String[] headNameValue = header.split(":", 2);
        if (headNameValue.length > 0) {
            String name = headNameValue[0].trim();
            RequestNameValue nameValue = new RequestNameValue(name, TARGET_HEADER);
            if (headNameValue.length == 2) {
                nameValue.setValue(headNameValue[1].trim());
            }
            request.addHeader(nameValue);
        }
    }
    if (timeout != null) {
        request.setTimeout(timeout);
    } else if (baseTimeout != null) {
        request.setTimeout(baseTimeout);
    } else if (configuration.getTimeout() != null) {
        request.setTimeout(configuration.getTimeout());
    }
    if (connectTimeout != null) {
        request.setConnectTimeout(connectTimeout);
    } else if (baseConnectTimeout != null) {
        request.setConnectTimeout(baseConnectTimeout);
    } else if (configuration.getConnectTimeout() != null) {
        request.setConnectTimeout(configuration.getConnectTimeout());
    }
    if (readTimeout != null) {
        request.setReadTimeout(readTimeout);
    } else if (baseReadTimeout != null) {
        request.setReadTimeout(baseReadTimeout);
    } else if (configuration.getReadTimeout() != null) {
        request.setReadTimeout(configuration.getReadTimeout());
    }
    if (retryCount != null) {
        request.setMaxRetryCount(retryCount);
    } else if (baseRetryCount != null) {
        request.setMaxRetryCount(baseRetryCount);
    } else if (configuration.getMaxRetryCount() != null) {
        request.setMaxRetryCount(configuration.getMaxRetryCount());
    }
    if (maxRetryInterval >= 0) {
        request.setMaxRetryInterval(maxRetryInterval);
    } else if (baseMaxRetryInterval != null) {
        request.setMaxRetryInterval(baseMaxRetryInterval);
    } else if (configuration.getMaxRetryInterval() >= 0) {
        request.setMaxRetryInterval(configuration.getMaxRetryInterval());
    }
    Class globalRetryerClass = configuration.getRetryer();
    if (retryerClass != null && ForestRetryer.class.isAssignableFrom(retryerClass)) {
        request.setRetryer(retryerClass);
    } else if (baseRetryerClass != null && ForestRetryer.class.isAssignableFrom(baseRetryerClass)) {
        request.setRetryer(baseRetryerClass);
    } else if (globalRetryerClass != null && ForestRetryer.class.isAssignableFrom(globalRetryerClass)) {
        request.setRetryer(globalRetryerClass);
    }
    if (onSuccessParameter != null) {
        OnSuccess<?> onSuccessCallback = (OnSuccess<?>) args[onSuccessParameter.getIndex()];
        request.setOnSuccess(onSuccessCallback);
    }
    if (onErrorParameter != null) {
        OnError onErrorCallback = (OnError) args[onErrorParameter.getIndex()];
        request.setOnError(onErrorCallback);
    }
    if (onRedirectionParameter != null) {
        OnRedirection onRedirectionCallback = (OnRedirection) args[onRedirectionParameter.getIndex()];
        request.setOnRedirection(onRedirectionCallback);
    }
    if (onProgressParameter != null) {
        OnProgress onProgressCallback = (OnProgress) args[onProgressParameter.getIndex()];
        request.setOnProgress(onProgressCallback);
    }
    if (onSaveCookieParameter != null) {
        OnSaveCookie onSaveCookieCallback = (OnSaveCookie) args[onSaveCookieParameter.getIndex()];
        request.setOnSaveCookie(onSaveCookieCallback);
    }
    if (onLoadCookieParameter != null) {
        OnLoadCookie onLoadCookieCallback = (OnLoadCookie) args[onLoadCookieParameter.getIndex()];
        request.setOnLoadCookie(onLoadCookieCallback);
    }
    String dataType = dataTypeTemplate.render(args);
    if (StringUtils.isEmpty(dataType)) {
        request.setDataType(ForestDataType.TEXT);
    } else {
        dataType = dataType.toUpperCase();
        ForestDataType forestDataType = ForestDataType.findByName(dataType);
        request.setDataType(forestDataType);
    }
    if (interceptorAttributesList != null && interceptorAttributesList.size() > 0) {
        for (InterceptorAttributes attributes : interceptorAttributesList) {
            InterceptorAttributes newAttrs = attributes.clone();
            request.addInterceptorAttributes(newAttrs.getInterceptorClass(), newAttrs);
            request.getInterceptorAttributes(newAttrs.getInterceptorClass()).render(args);
        }
    }
    if (globalInterceptorList != null && globalInterceptorList.size() > 0) {
        for (Interceptor item : globalInterceptorList) {
            request.addInterceptor(item);
        }
    }
    if (baseInterceptorList != null && baseInterceptorList.size() > 0) {
        for (Interceptor item : baseInterceptorList) {
            request.addInterceptor(item);
        }
    }
    if (interceptorList != null && interceptorList.size() > 0) {
        for (Interceptor item : interceptorList) {
            request.addInterceptor(item);
        }
    }
    return request;
}
Also used : MalformedURLException(java.net.MalformedURLException) OnError(com.dtflys.forest.callback.OnError) OnProgress(com.dtflys.forest.callback.OnProgress) SSLKeyStore(com.dtflys.forest.ssl.SSLKeyStore) ForestDataType(com.dtflys.forest.utils.ForestDataType) ForestURL(com.dtflys.forest.http.ForestURL) ForestMultipartFactory(com.dtflys.forest.multipart.ForestMultipartFactory) AddressSource(com.dtflys.forest.callback.AddressSource) OnRedirection(com.dtflys.forest.callback.OnRedirection) ForestAddress(com.dtflys.forest.http.ForestAddress) OnSaveCookie(com.dtflys.forest.callback.OnSaveCookie) ForestQueryMap(com.dtflys.forest.http.ForestQueryMap) VariableScope(com.dtflys.forest.config.VariableScope) SubVariableScope(com.dtflys.forest.mapping.SubVariableScope) OnLoadCookie(com.dtflys.forest.callback.OnLoadCookie) ForestJsonConverter(com.dtflys.forest.converter.json.ForestJsonConverter) MappingTemplate(com.dtflys.forest.mapping.MappingTemplate) ForestMultipart(com.dtflys.forest.multipart.ForestMultipart) OnSuccess(com.dtflys.forest.callback.OnSuccess) ForestQueryMap(com.dtflys.forest.http.ForestQueryMap) URL(java.net.URL) ForestURL(com.dtflys.forest.http.ForestURL) ForestRequestType(com.dtflys.forest.http.ForestRequestType) RequestNameValue(com.dtflys.forest.utils.RequestNameValue) SubVariableScope(com.dtflys.forest.mapping.SubVariableScope) Interceptor(com.dtflys.forest.interceptor.Interceptor) ForestRequestBody(com.dtflys.forest.http.ForestRequestBody) MappingParameter(com.dtflys.forest.mapping.MappingParameter) ForestRuntimeException(com.dtflys.forest.exceptions.ForestRuntimeException) ForestRequest(com.dtflys.forest.http.ForestRequest) StringRequestBody(com.dtflys.forest.http.body.StringRequestBody) ForestQueryParameter(com.dtflys.forest.http.ForestQueryParameter) InterceptorAttributes(com.dtflys.forest.interceptor.InterceptorAttributes) ForestRetryer(com.dtflys.forest.retryer.ForestRetryer)

Example 3 with MappingParameter

use of com.dtflys.forest.mapping.MappingParameter in project forest by dromara.

the class JSONBodyLifeCycle method onParameterInitialized.

@Override
public void onParameterInitialized(ForestMethod method, MappingParameter parameter, JSONBody annotation) {
    super.onParameterInitialized(method, parameter, annotation);
    MetaRequest metaRequest = method.getMetaRequest();
    String methodName = methodName(method);
    if (metaRequest == null) {
        throw new ForestRuntimeException("[Forest] method '" + methodName + "' has not bind a Forest request annotation. Hence the annotation @JSONBody cannot be bind on a parameter in this method.");
    }
    boolean hasDataFileAnn = false;
    for (Parameter param : method.getMethod().getParameters()) {
        Annotation dataFileAnn = param.getAnnotation(DataFile.class);
        if (dataFileAnn != null) {
            hasDataFileAnn = true;
            break;
        }
    }
    String contentTypeStr = metaRequest.getContentType();
    if (StringUtils.isBlank(contentTypeStr) && !hasDataFileAnn) {
        metaRequest.setContentType(ContentType.APPLICATION_JSON);
    }
    if (metaRequest.getBodyType() == null) {
        metaRequest.setBodyType(ForestDataType.JSON);
    }
    parameter.setTarget(MappingParameter.TARGET_BODY);
}
Also used : MetaRequest(com.dtflys.forest.reflection.MetaRequest) ForestRuntimeException(com.dtflys.forest.exceptions.ForestRuntimeException) Parameter(java.lang.reflect.Parameter) MappingParameter(com.dtflys.forest.mapping.MappingParameter) Annotation(java.lang.annotation.Annotation)

Example 4 with MappingParameter

use of com.dtflys.forest.mapping.MappingParameter in project forest by dromara.

the class XMLBodyLifeCycle method onParameterInitialized.

@Override
public void onParameterInitialized(ForestMethod method, MappingParameter parameter, XMLBody annotation) {
    super.onParameterInitialized(method, parameter, annotation);
    MetaRequest metaRequest = method.getMetaRequest();
    String methodName = methodName(method);
    if (metaRequest == null) {
        throw new ForestRuntimeException("[Forest] method '" + methodName + "' has not bind a Forest request annotation. Hence the annotation @XMLBody cannot be bind on a parameter in this method.");
    }
    String contentType = metaRequest.getContentType();
    if (StringUtils.isNotEmpty(contentType) && !ContentType.APPLICATION_XML.equals(contentType) && contentType.indexOf("$") < 0) {
        throw new ForestRuntimeException("[Forest] the Content-Type of request binding on method '" + methodName + "' has already been set value '" + contentType + "', not 'application/xml'. Hence the annotation @XMLBody cannot be bind on a parameter in this method.");
    }
    boolean hasDataFileAnn = false;
    for (Parameter param : method.getMethod().getParameters()) {
        Annotation dataFileAnn = param.getAnnotation(DataFile.class);
        if (dataFileAnn != null) {
            hasDataFileAnn = true;
            break;
        }
    }
    Filter filter = method.getConfiguration().newFilterInstance("xml");
    parameter.addFilter(filter);
    if (StringUtils.isBlank(contentType) && !hasDataFileAnn) {
        metaRequest.setContentType(ContentType.APPLICATION_XML);
    }
    if (metaRequest.getBodyType() == null) {
        metaRequest.setBodyType(ForestDataType.XML);
    }
}
Also used : MetaRequest(com.dtflys.forest.reflection.MetaRequest) Filter(com.dtflys.forest.filter.Filter) ForestRuntimeException(com.dtflys.forest.exceptions.ForestRuntimeException) MappingParameter(com.dtflys.forest.mapping.MappingParameter) Parameter(java.lang.reflect.Parameter) Annotation(java.lang.annotation.Annotation)

Example 5 with MappingParameter

use of com.dtflys.forest.mapping.MappingParameter in project forest by dromara.

the class BinaryBodyLifeCycle method onParameterInitialized.

@Override
public void onParameterInitialized(ForestMethod method, MappingParameter parameter, BinaryBody annotation) {
    super.onParameterInitialized(method, parameter, annotation);
    MetaRequest metaRequest = method.getMetaRequest();
    String methodName = methodName(method);
    if (metaRequest == null) {
        throw new ForestRuntimeException("[Forest] method '" + methodName + "' has not bind a Forest request annotation. Hence the annotation @BinaryBody cannot be bind on a parameter in this method.");
    }
    boolean hasDataFileAnn = false;
    for (Parameter param : method.getMethod().getParameters()) {
        Annotation dataFileAnn = param.getAnnotation(DataFile.class);
        if (dataFileAnn != null) {
            hasDataFileAnn = true;
            break;
        }
    }
    String contentTypeStr = metaRequest.getContentType();
    if (StringUtils.isBlank(contentTypeStr) && !hasDataFileAnn) {
        metaRequest.setContentType(ContentType.APPLICATION_OCTET_STREAM);
    }
    if (metaRequest.getBodyType() == null) {
        metaRequest.setBodyType(ForestDataType.BINARY);
    }
    parameter.setTarget(MappingParameter.TARGET_BODY);
}
Also used : MetaRequest(com.dtflys.forest.reflection.MetaRequest) ForestRuntimeException(com.dtflys.forest.exceptions.ForestRuntimeException) Parameter(java.lang.reflect.Parameter) MappingParameter(com.dtflys.forest.mapping.MappingParameter) Annotation(java.lang.annotation.Annotation)

Aggregations

MappingParameter (com.dtflys.forest.mapping.MappingParameter)7 ForestRuntimeException (com.dtflys.forest.exceptions.ForestRuntimeException)5 Annotation (java.lang.annotation.Annotation)5 MetaRequest (com.dtflys.forest.reflection.MetaRequest)4 Parameter (java.lang.reflect.Parameter)4 ForestQueryParameter (com.dtflys.forest.http.ForestQueryParameter)3 ForestRequestType (com.dtflys.forest.http.ForestRequestType)3 ForestDataType (com.dtflys.forest.utils.ForestDataType)3 ContentType (com.dtflys.forest.backend.ContentType)2 OnError (com.dtflys.forest.callback.OnError)2 OnLoadCookie (com.dtflys.forest.callback.OnLoadCookie)2 OnProgress (com.dtflys.forest.callback.OnProgress)2 MappingTemplate (com.dtflys.forest.mapping.MappingTemplate)2 AddressSource (com.dtflys.forest.callback.AddressSource)1 OnRedirection (com.dtflys.forest.callback.OnRedirection)1 OnSaveCookie (com.dtflys.forest.callback.OnSaveCookie)1 OnSuccess (com.dtflys.forest.callback.OnSuccess)1 VariableScope (com.dtflys.forest.config.VariableScope)1 ForestConverter (com.dtflys.forest.converter.ForestConverter)1 ForestEncoder (com.dtflys.forest.converter.ForestEncoder)1