com.ifengxue.http.executor.Request Maven / Gradle / Ivy
/*
* Copyright 2019 https://www.ifengxue.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ifengxue.http.executor;
import com.ifengxue.http.annotation.Header;
import com.ifengxue.http.annotation.HttpMethod;
import com.ifengxue.http.collection.MultiMap;
import com.ifengxue.http.contract.CallbackHandler;
import io.mikael.urlbuilder.UrlBuilder;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.Getter;
import lombok.ToString;
import lombok.experimental.Delegate;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.NameValuePair;
@ToString
@SuppressWarnings("unused")
public class Request implements RequestContext {
private static final Pattern PATH_VARIABLE_PATTERN = Pattern.compile("\\{(.*?)}");
/**
* 请求URL
*/
@Getter
private String url;
/**
* 请求方法
*/
@Getter
private String method;
/**
* query parameter names
*
* @see com.ifengxue.http.annotation.QueryParam
*/
@Getter
private Set queryParameterNames;
/**
* 参数列表
*/
@Getter
private Map parameterMap;
/**
* 请求body
*/
private Object body;
/**
* 请求头
*/
@Getter
private Map headerMap;
/**
* callback
*/
@Getter
private CallbackHandler callbackHandler;
@Delegate
private RequestContext requestContext = new SimpleRequestContext();
private Request() {
}
/**
* 替换请求URL
*
* @param newUrl 新URL
*/
public Request replaceUrl(String newUrl) {
this.url = newUrl;
return this;
}
/**
* 添加请求头
*
* @param name 请求头名称
* @param value 请求头值
*/
public Request addHeader(String name, String value) {
Objects.requireNonNull(headerMap).put(name, value);
return this;
}
/**
* 移除请求头
*
* @param name 请求头名称
*/
public Request removeHeader(String name) {
Objects.requireNonNull(headerMap).remove(name);
return this;
}
/**
* 检查是否包含指定请求头
*
* @param name 请求头名称
*/
public boolean containsHeader(String name) {
return Optional.ofNullable(headerMap).map(m -> m.containsKey(name)).orElse(false);
}
/**
* 添加请求参数
*
* @param name 请求参数名称
* @param value 参数值
*/
@SuppressWarnings("unchecked")
public Request addParameter(String name, Object value) {
Map map = Objects.requireNonNull(parameterMap);
if (!map.containsKey(name)) {
map.put(name, value);
} else {
Object value0 = map.get(name);
if (value0 instanceof Collection) {
if (value instanceof Collection) {
((Collection) value0).addAll((Collection) value);
} else {
((Collection) value0).add(value);
}
} else {
List