Browse Source
* Add HTTP components(添加HTTP组件) * HTTP组件的相关代码优化 * Repair HTTP Component Related Code Based on Optimized Recommendations (基于优化建议的http组件相关代码修复) * Repair HTTP connection leak problem (修复http连接泄漏问题)pull/2/head
黄聪
5 years ago
committed by
Baoqi Wu
18 changed files with 1093 additions and 4 deletions
@ -0,0 +1,30 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 cn.escheduler.common.enums; |
||||
|
||||
/** |
||||
* http check condition |
||||
*/ |
||||
public enum HttpCheckCondition { |
||||
/** |
||||
* 0 status_code_default:200 |
||||
* 1 status_code_custom |
||||
* 2 body_contains |
||||
* 3 body_not_contains |
||||
*/ |
||||
STATUS_CODE_DEFAULT,STATUS_CODE_CUSTOM, BODY_CONTAINS, BODY_NOT_CONTAINS |
||||
} |
@ -0,0 +1,31 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 cn.escheduler.common.enums; |
||||
|
||||
/** |
||||
* http method |
||||
*/ |
||||
public enum HttpMethod { |
||||
/** |
||||
* 0 get |
||||
* 1 post |
||||
* 2 head |
||||
* 3 put |
||||
* 4 delete |
||||
*/ |
||||
GET, POST, HEAD, PUT, DELETE |
||||
} |
@ -0,0 +1,29 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 cn.escheduler.common.enums; |
||||
|
||||
/** |
||||
* http parameters type |
||||
*/ |
||||
public enum HttpParametersType { |
||||
/** |
||||
* 0 parameter; |
||||
* 1 body; |
||||
* 2 headers; |
||||
*/ |
||||
PARAMETER,BODY,HEADERS |
||||
} |
@ -0,0 +1,125 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 cn.escheduler.common.process; |
||||
|
||||
import cn.escheduler.common.enums.HttpParametersType; |
||||
|
||||
import java.util.Objects; |
||||
|
||||
public class HttpProperty { |
||||
/** |
||||
* key |
||||
*/ |
||||
private String prop; |
||||
|
||||
/** |
||||
* httpParametersType |
||||
*/ |
||||
private HttpParametersType httpParametersType; |
||||
|
||||
/** |
||||
* value |
||||
*/ |
||||
private String value; |
||||
|
||||
public HttpProperty() { |
||||
} |
||||
|
||||
public HttpProperty(String prop, HttpParametersType httpParametersType, String value) { |
||||
this.prop = prop; |
||||
this.httpParametersType = httpParametersType; |
||||
this.value = value; |
||||
} |
||||
|
||||
/** |
||||
* getter method |
||||
* |
||||
* @return the prop |
||||
* @see HttpProperty#prop |
||||
*/ |
||||
public String getProp() { |
||||
return prop; |
||||
} |
||||
|
||||
/** |
||||
* setter method |
||||
* |
||||
* @param prop the prop to set |
||||
* @see HttpProperty#prop |
||||
*/ |
||||
public void setProp(String prop) { |
||||
this.prop = prop; |
||||
} |
||||
|
||||
/** |
||||
* getter method |
||||
* |
||||
* @return the value |
||||
* @see HttpProperty#value |
||||
*/ |
||||
public String getValue() { |
||||
return value; |
||||
} |
||||
|
||||
/** |
||||
* setter method |
||||
* |
||||
* @param value the value to set |
||||
* @see HttpProperty#value |
||||
*/ |
||||
public void setValue(String value) { |
||||
this.value = value; |
||||
} |
||||
|
||||
public HttpParametersType getHttpParametersType() { |
||||
return httpParametersType; |
||||
} |
||||
|
||||
public void setHttpParametersType(HttpParametersType httpParametersType) { |
||||
this.httpParametersType = httpParametersType; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object o) { |
||||
if (this == o) { |
||||
return true; |
||||
} |
||||
if (o == null || getClass() != o.getClass()) { |
||||
return false; |
||||
} |
||||
HttpProperty property = (HttpProperty) o; |
||||
return Objects.equals(prop, property.prop) && |
||||
Objects.equals(value, property.value); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return Objects.hash(prop, value); |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return "HttpProperty{" + |
||||
"prop='" + prop + '\'' + |
||||
", httpParametersType=" + httpParametersType + |
||||
", value='" + value + '\'' + |
||||
'}'; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,108 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 cn.escheduler.common.task.http; |
||||
|
||||
import cn.escheduler.common.enums.HttpCheckCondition; |
||||
import cn.escheduler.common.enums.HttpMethod; |
||||
import cn.escheduler.common.process.HttpProperty; |
||||
import cn.escheduler.common.task.AbstractParameters; |
||||
import org.apache.commons.lang.StringUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* http parameter |
||||
*/ |
||||
public class HttpParameters extends AbstractParameters { |
||||
/** |
||||
* url |
||||
*/ |
||||
private String url; |
||||
|
||||
/** |
||||
* httpMethod |
||||
*/ |
||||
private HttpMethod httpMethod; |
||||
|
||||
/** |
||||
* http params |
||||
*/ |
||||
private List<HttpProperty> httpParams; |
||||
|
||||
/** |
||||
* httpCheckCondition |
||||
*/ |
||||
private HttpCheckCondition httpCheckCondition = HttpCheckCondition.STATUS_CODE_DEFAULT; |
||||
|
||||
/** |
||||
* condition |
||||
*/ |
||||
private String condition; |
||||
|
||||
|
||||
|
||||
@Override |
||||
public boolean checkParameters() { |
||||
return StringUtils.isNotEmpty(url); |
||||
} |
||||
|
||||
@Override |
||||
public List<String> getResourceFilesList() { |
||||
return new ArrayList<>(); |
||||
} |
||||
|
||||
public String getUrl() { |
||||
return url; |
||||
} |
||||
|
||||
public void setUrl(String url) { |
||||
this.url = url; |
||||
} |
||||
|
||||
public HttpMethod getHttpMethod() { |
||||
return httpMethod; |
||||
} |
||||
|
||||
public void setHttpMethod(HttpMethod httpMethod) { |
||||
this.httpMethod = httpMethod; |
||||
} |
||||
|
||||
public List<HttpProperty> getHttpParams() { |
||||
return httpParams; |
||||
} |
||||
|
||||
public void setHttpParams(List<HttpProperty> httpParams) { |
||||
this.httpParams = httpParams; |
||||
} |
||||
|
||||
public HttpCheckCondition getHttpCheckCondition() { |
||||
return httpCheckCondition; |
||||
} |
||||
|
||||
public void setHttpCheckCondition(HttpCheckCondition httpCheckCondition) { |
||||
this.httpCheckCondition = httpCheckCondition; |
||||
} |
||||
|
||||
public String getCondition() { |
||||
return condition; |
||||
} |
||||
|
||||
public void setCondition(String condition) { |
||||
this.condition = condition; |
||||
} |
||||
} |
@ -0,0 +1,270 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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 cn.escheduler.server.worker.task.http; |
||||
|
||||
|
||||
import cn.escheduler.common.enums.HttpMethod; |
||||
import cn.escheduler.common.enums.HttpParametersType; |
||||
import cn.escheduler.common.process.HttpProperty; |
||||
import cn.escheduler.common.process.Property; |
||||
import cn.escheduler.common.task.AbstractParameters; |
||||
import cn.escheduler.common.task.http.HttpParameters; |
||||
import cn.escheduler.common.utils.Bytes; |
||||
import cn.escheduler.common.utils.DateUtils; |
||||
import cn.escheduler.common.utils.ParameterUtils; |
||||
import cn.escheduler.dao.DaoFactory; |
||||
import cn.escheduler.dao.ProcessDao; |
||||
import cn.escheduler.dao.model.ProcessInstance; |
||||
import cn.escheduler.server.utils.ParamUtils; |
||||
import cn.escheduler.server.worker.task.AbstractTask; |
||||
import cn.escheduler.server.worker.task.TaskProps; |
||||
import com.alibaba.fastjson.JSONObject; |
||||
import org.apache.commons.io.Charsets; |
||||
import org.apache.commons.lang3.StringUtils; |
||||
import org.apache.http.HttpEntity; |
||||
import org.apache.http.ParseException; |
||||
import org.apache.http.client.config.RequestConfig; |
||||
import org.apache.http.client.methods.CloseableHttpResponse; |
||||
import org.apache.http.client.methods.HttpUriRequest; |
||||
import org.apache.http.client.methods.RequestBuilder; |
||||
import org.apache.http.entity.StringEntity; |
||||
import org.apache.http.impl.client.CloseableHttpClient; |
||||
import org.apache.http.impl.client.HttpClientBuilder; |
||||
import org.apache.http.impl.client.HttpClients; |
||||
import org.apache.http.util.EntityUtils; |
||||
import org.slf4j.Logger; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* http task |
||||
*/ |
||||
public class HttpTask extends AbstractTask { |
||||
|
||||
private HttpParameters httpParameters; |
||||
|
||||
/** |
||||
* process database access |
||||
*/ |
||||
private ProcessDao processDao; |
||||
|
||||
/** |
||||
* Convert mill seconds to second unit |
||||
*/ |
||||
protected static final int MAX_CONNECTION_MILLISECONDS = 60000; |
||||
|
||||
protected static final String APPLICATION_JSON = "application/json"; |
||||
|
||||
protected String output; |
||||
|
||||
|
||||
public HttpTask(TaskProps props, Logger logger) { |
||||
super(props, logger); |
||||
this.processDao = DaoFactory.getDaoInstance(ProcessDao.class); |
||||
} |
||||
|
||||
@Override |
||||
public void init() { |
||||
logger.info("http task params {}", taskProps.getTaskParams()); |
||||
this.httpParameters = JSONObject.parseObject(taskProps.getTaskParams(), HttpParameters.class); |
||||
|
||||
if (!httpParameters.checkParameters()) { |
||||
throw new RuntimeException("http task params is not valid"); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void handle() throws Exception { |
||||
String threadLoggerInfoName = String.format("TaskLogInfo-%s", taskProps.getTaskAppId()); |
||||
Thread.currentThread().setName(threadLoggerInfoName); |
||||
|
||||
long startTime = System.currentTimeMillis(); |
||||
String statusCode = null; |
||||
String body = null; |
||||
try(CloseableHttpClient client = createHttpClient()) { |
||||
try(CloseableHttpResponse response = sendRequest(client)) { |
||||
statusCode = String.valueOf(getStatusCode(response)); |
||||
body = getResponseBody(response); |
||||
exitStatusCode = validResponse(body, statusCode); |
||||
long costTime = System.currentTimeMillis() - startTime; |
||||
logger.info("startTime: {}, httpUrl: {}, httpMethod: {}, costTime : {}Millisecond, statusCode : {}, body : {}, log : {}", |
||||
DateUtils.format2Readable(startTime), httpParameters.getUrl(),httpParameters.getHttpMethod(), costTime, statusCode, body, output); |
||||
}catch (Exception e) { |
||||
appendMessage(e.toString()); |
||||
exitStatusCode = -1; |
||||
logger.error("httpUrl[" + httpParameters.getUrl() + "] connection failed:"+output, e); |
||||
} |
||||
} catch (Exception e) { |
||||
appendMessage(e.toString()); |
||||
exitStatusCode = -1; |
||||
logger.error("httpUrl[" + httpParameters.getUrl() + "] connection failed:"+output, e); |
||||
} |
||||
} |
||||
|
||||
protected CloseableHttpResponse sendRequest(CloseableHttpClient client) throws IOException { |
||||
RequestBuilder builder = createRequestBuilder(); |
||||
ProcessInstance processInstance = processDao.findProcessInstanceByTaskId(taskProps.getTaskInstId()); |
||||
|
||||
Map<String, Property> paramsMap = ParamUtils.convert(taskProps.getUserDefParamsMap(), |
||||
taskProps.getDefinedParams(), |
||||
httpParameters.getLocalParametersMap(), |
||||
processInstance.getCmdTypeIfComplement(), |
||||
processInstance.getScheduleTime()); |
||||
List<HttpProperty> httpPropertyList = new ArrayList<>(); |
||||
if(httpParameters.getHttpParams() != null && httpParameters.getHttpParams().size() > 0){ |
||||
for (HttpProperty httpProperty: httpParameters.getHttpParams()) { |
||||
String jsonObject = JSONObject.toJSONString(httpProperty); |
||||
String params = ParameterUtils.convertParameterPlaceholders(jsonObject,ParamUtils.convert(paramsMap)); |
||||
logger.info("http request params:{}",params); |
||||
httpPropertyList.add(JSONObject.parseObject(params,HttpProperty.class)); |
||||
} |
||||
} |
||||
addRequestParams(builder,httpPropertyList); |
||||
HttpUriRequest request = builder.setUri(httpParameters.getUrl()).build(); |
||||
setHeaders(request,httpPropertyList); |
||||
return client.execute(request); |
||||
} |
||||
|
||||
protected String getResponseBody(CloseableHttpResponse httpResponse) throws ParseException, IOException { |
||||
if (httpResponse == null) { |
||||
return null; |
||||
} |
||||
HttpEntity entity = httpResponse.getEntity(); |
||||
if (entity == null) { |
||||
return null; |
||||
} |
||||
String webPage = EntityUtils.toString(entity, Bytes.UTF8_ENCODING); |
||||
return webPage; |
||||
} |
||||
|
||||
protected int getStatusCode(CloseableHttpResponse httpResponse) { |
||||
int status = httpResponse.getStatusLine().getStatusCode(); |
||||
return status; |
||||
} |
||||
|
||||
protected int validResponse(String body, String statusCode){ |
||||
int exitStatusCode = 0; |
||||
switch (httpParameters.getHttpCheckCondition()) { |
||||
case BODY_CONTAINS: |
||||
if (StringUtils.isEmpty(body) || !body.contains(httpParameters.getCondition())) { |
||||
appendMessage(httpParameters.getUrl() + " doesn contain " |
||||
+ httpParameters.getCondition()); |
||||
exitStatusCode = -1; |
||||
} |
||||
break; |
||||
case BODY_NOT_CONTAINS: |
||||
if (StringUtils.isEmpty(body) || body.contains(httpParameters.getCondition())) { |
||||
appendMessage(httpParameters.getUrl() + " contains " |
||||
+ httpParameters.getCondition()); |
||||
exitStatusCode = -1; |
||||
} |
||||
break; |
||||
case STATUS_CODE_CUSTOM: |
||||
if (!statusCode.equals(httpParameters.getCondition())) { |
||||
appendMessage(httpParameters.getUrl() + " statuscode: " + statusCode + ", Must be: " + httpParameters.getCondition()); |
||||
exitStatusCode = -1; |
||||
} |
||||
break; |
||||
default: |
||||
if (!"200".equals(statusCode)) { |
||||
appendMessage(httpParameters.getUrl() + " statuscode: " + statusCode + ", Must be: 200"); |
||||
exitStatusCode = -1; |
||||
} |
||||
break; |
||||
} |
||||
return exitStatusCode; |
||||
} |
||||
|
||||
public String getOutput() { |
||||
return output; |
||||
} |
||||
|
||||
protected void appendMessage(String message) { |
||||
if (output == null) { |
||||
output = ""; |
||||
} |
||||
if (message != null && !message.trim().isEmpty()) { |
||||
output += message; |
||||
} |
||||
} |
||||
|
||||
protected void addRequestParams(RequestBuilder builder,List<HttpProperty> httpPropertyList) { |
||||
if(httpPropertyList != null && httpPropertyList.size() > 0){ |
||||
JSONObject jsonParam = new JSONObject(); |
||||
for (HttpProperty property: httpPropertyList){ |
||||
if(property.getHttpParametersType() != null){ |
||||
if (property.getHttpParametersType().equals(HttpParametersType.PARAMETER)){ |
||||
builder.addParameter(property.getProp(), property.getValue()); |
||||
}else if(property.getHttpParametersType().equals(HttpParametersType.BODY)){ |
||||
jsonParam.put(property.getProp(), property.getValue()); |
||||
} |
||||
} |
||||
} |
||||
StringEntity postingString = new StringEntity(jsonParam.toString(), Charsets.UTF_8); |
||||
postingString.setContentEncoding(Bytes.UTF8_ENCODING); |
||||
postingString.setContentType(APPLICATION_JSON); |
||||
builder.setEntity(postingString); |
||||
} |
||||
} |
||||
|
||||
protected void setHeaders(HttpUriRequest request,List<HttpProperty> httpPropertyList) { |
||||
if(httpPropertyList != null && httpPropertyList.size() > 0){ |
||||
for (HttpProperty property: httpPropertyList){ |
||||
if(property.getHttpParametersType() != null) { |
||||
if (property.getHttpParametersType().equals(HttpParametersType.HEADERS)) { |
||||
request.addHeader(property.getProp(), property.getValue()); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected CloseableHttpClient createHttpClient() { |
||||
final RequestConfig requestConfig = requestConfig(); |
||||
HttpClientBuilder httpClientBuilder; |
||||
httpClientBuilder = HttpClients.custom().setDefaultRequestConfig(requestConfig); |
||||
return httpClientBuilder.build(); |
||||
} |
||||
|
||||
private RequestConfig requestConfig() { |
||||
return RequestConfig.custom().setSocketTimeout(MAX_CONNECTION_MILLISECONDS).setConnectTimeout(MAX_CONNECTION_MILLISECONDS).build(); |
||||
} |
||||
|
||||
protected RequestBuilder createRequestBuilder() { |
||||
if (httpParameters.getHttpMethod().equals(HttpMethod.GET)) { |
||||
return RequestBuilder.get(); |
||||
} else if (httpParameters.getHttpMethod().equals(HttpMethod.POST)) { |
||||
return RequestBuilder.post(); |
||||
} else if (httpParameters.getHttpMethod().equals(HttpMethod.HEAD)) { |
||||
return RequestBuilder.head(); |
||||
} else if (httpParameters.getHttpMethod().equals(HttpMethod.PUT)) { |
||||
return RequestBuilder.put(); |
||||
} else if (httpParameters.getHttpMethod().equals(HttpMethod.DELETE)) { |
||||
return RequestBuilder.delete(); |
||||
} else { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public AbstractParameters getParameters() { |
||||
return this.httpParameters; |
||||
} |
||||
} |
@ -0,0 +1,242 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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. |
||||
*/ |
||||
<template> |
||||
<div class="user-def-params-model"> |
||||
<div class="select-listpp" |
||||
v-for="(item,$index) in httpParamsList" |
||||
:key="item.id" |
||||
@click="_getIndex($index)"> |
||||
<x-input |
||||
:disabled="isDetails" |
||||
type="text" |
||||
v-model="httpParamsList[$index].prop" |
||||
:placeholder="$t('prop(required)')" |
||||
@on-blur="_verifProp()" |
||||
:style="inputStyle"> |
||||
</x-input> |
||||
<x-select |
||||
@change="_handlePositionChanged" |
||||
v-model="httpParamsList[$index].httpParametersType" |
||||
:placeholder="$t('Http Parameters Position')" |
||||
:disabled="isDetails" |
||||
:style="inputStyle" |
||||
> |
||||
<x-option |
||||
v-for="position in positionList" |
||||
:key="position.code" |
||||
:value="position.id" |
||||
:label="position.code"> |
||||
</x-option> |
||||
</x-select> |
||||
<x-input |
||||
:disabled="isDetails" |
||||
type="text" |
||||
v-model="httpParamsList[$index].value" |
||||
:placeholder="$t('value(required)')" |
||||
@on-blur="_handleValue()" |
||||
:style="inputStyle"> |
||||
</x-input> |
||||
<span class="lt-add"> |
||||
<a href="javascript:" style="color:red;" @click="!isDetails && _removeUdp($index)" > |
||||
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" ></i> |
||||
</a> |
||||
</span> |
||||
<span class="add" v-if="$index === (httpParamsList.length - 1)"> |
||||
<a href="javascript:" @click="!isDetails && _addUdp()" > |
||||
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i> |
||||
</a> |
||||
</span> |
||||
</div> |
||||
<span class="add-dp" v-if="!httpParamsList.length"> |
||||
<a href="javascript:" @click="!isDetails && _addUdp()" > |
||||
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i> |
||||
</a> |
||||
</span> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import _ from 'lodash' |
||||
import i18n from '@/module/i18n' |
||||
import { positionList } from './commcon' |
||||
import disabledState from '@/module/mixin/disabledState' |
||||
export default { |
||||
name: 'http-params', |
||||
data () { |
||||
return { |
||||
// Increased data |
||||
httpParamsList: [], |
||||
// Current execution index |
||||
httpParamsIndex: null, |
||||
// 参数位置的下拉框 |
||||
positionList:positionList |
||||
} |
||||
}, |
||||
mixins: [disabledState], |
||||
props: { |
||||
udpList: Array, |
||||
// hide direct/type |
||||
hide: { |
||||
type: Boolean, |
||||
default: true |
||||
} |
||||
}, |
||||
methods: { |
||||
/** |
||||
* Current index |
||||
*/ |
||||
_getIndex (index) { |
||||
this.httpParamsIndex = index |
||||
}, |
||||
/** |
||||
* 获取参数位置 |
||||
*/ |
||||
_handlePositionChanged () { |
||||
this._verifProp('value') |
||||
}, |
||||
/** |
||||
* delete item |
||||
*/ |
||||
_removeUdp (index) { |
||||
this.httpParamsList.splice(index, 1) |
||||
this._verifProp('value') |
||||
}, |
||||
/** |
||||
* add |
||||
*/ |
||||
_addUdp () { |
||||
this.httpParamsList.push({ |
||||
prop: '', |
||||
httpParametersType: 'PARAMETER', |
||||
value: '' |
||||
}) |
||||
}, |
||||
/** |
||||
* blur verification |
||||
*/ |
||||
_handleValue () { |
||||
this._verifValue('value') |
||||
}, |
||||
/** |
||||
* Verify that the value exists or is empty |
||||
*/ |
||||
_verifProp (type) { |
||||
let arr = [] |
||||
let flag = true |
||||
_.map(this.httpParamsList, v => { |
||||
arr.push(v.prop) |
||||
if (!v.prop) { |
||||
flag = false |
||||
} |
||||
if(v.value === ''){ |
||||
this.$message.warning(`${i18n.$t('value is empty')}`) |
||||
return false |
||||
} |
||||
}) |
||||
if (!flag) { |
||||
if (!type) { |
||||
this.$message.warning(`${i18n.$t('prop is empty')}`) |
||||
} |
||||
return false |
||||
} |
||||
let newArr = _.cloneDeep(_.uniqWith(arr, _.isEqual)) |
||||
if (newArr.length !== arr.length) { |
||||
if (!type) { |
||||
this.$message.warning(`${i18n.$t('prop is repeat')}`) |
||||
} |
||||
return false |
||||
} |
||||
this.$emit('on-http-params', _.cloneDeep(this.httpParamsList)) |
||||
return true |
||||
}, |
||||
_verifValue (type) { |
||||
let arr = [] |
||||
let flag = true |
||||
_.map(this.httpParamsList, v => { |
||||
arr.push(v.value) |
||||
if (!v.value) { |
||||
flag = false |
||||
} |
||||
}) |
||||
if (!flag) { |
||||
this.$message.warning(`${i18n.$t('value is empty')}`) |
||||
return false |
||||
} |
||||
this.$emit('on-http-params', _.cloneDeep(this.httpParamsList)) |
||||
return true |
||||
} |
||||
}, |
||||
watch: { |
||||
// Monitor data changes |
||||
udpList () { |
||||
this.httpParamsList = this.udpList |
||||
} |
||||
}, |
||||
created () { |
||||
this.httpParamsList = this.udpList |
||||
}, |
||||
computed: { |
||||
inputStyle () { |
||||
return "width:30%" |
||||
} |
||||
}, |
||||
mounted () { |
||||
}, |
||||
components: { } |
||||
} |
||||
</script> |
||||
|
||||
<style lang="scss" rel="stylesheet/scss"> |
||||
.user-def-params-model { |
||||
.select-listpp { |
||||
margin-bottom: 6px; |
||||
.lt-add { |
||||
padding-left: 4px; |
||||
a { |
||||
.iconfont { |
||||
font-size: 18px; |
||||
vertical-align: middle; |
||||
margin-bottom: -2px; |
||||
display: inline-block; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.add { |
||||
a { |
||||
color: #000; |
||||
.iconfont { |
||||
font-size: 18px; |
||||
vertical-align: middle; |
||||
display: inline-block; |
||||
margin-top: 1px; |
||||
} |
||||
} |
||||
} |
||||
.add-dp{ |
||||
a { |
||||
color: #0097e0; |
||||
.iconfont { |
||||
font-size: 18px; |
||||
vertical-align: middle; |
||||
display: inline-block; |
||||
margin-top: 2px; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</style> |
||||
|
@ -0,0 +1,191 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You 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. |
||||
*/ |
||||
<template> |
||||
<div class="http-model"> |
||||
<m-list-box> |
||||
<div slot="text">{{$t('Http Url')}}</div> |
||||
<div slot="content"> |
||||
<x-input |
||||
:autosize="{minRows:2}" |
||||
:disabled="isDetails" |
||||
type="textarea" |
||||
v-model="url" |
||||
:placeholder="$t('Please Enter Http Url')" |
||||
autocomplete="off"> |
||||
</x-input> |
||||
</div> |
||||
</m-list-box> |
||||
<m-list-box> |
||||
<div slot="text">{{$t('Http Method')}}</div> |
||||
<div slot="content"> |
||||
<x-select |
||||
style="width: 150px;" |
||||
v-model="httpMethod" |
||||
:disabled="isDetails"> |
||||
<x-option |
||||
v-for="city in httpMethodList" |
||||
:key="city.code" |
||||
:value="city.code" |
||||
:label="city.code"> |
||||
</x-option> |
||||
</x-select> |
||||
</div> |
||||
</m-list-box> |
||||
<m-list-box> |
||||
<div slot="text">{{$t('Http Parameters')}}</div> |
||||
<div slot="content"> |
||||
<m-http-params |
||||
ref="refHttpParams" |
||||
@on-http-params="_onHttpParams" |
||||
:udp-list="httpParams" |
||||
:hide="false"> |
||||
</m-http-params> |
||||
</div> |
||||
</m-list-box> |
||||
<m-list-box> |
||||
<div slot="text">{{$t('Http Check Condition')}}</div> |
||||
<div slot="content"> |
||||
<x-select |
||||
style="width: 150px;" |
||||
v-model="httpCheckCondition" |
||||
:disabled="isDetails"> |
||||
<x-option |
||||
v-for="city in httpCheckConditionList" |
||||
:key="city.code" |
||||
:value="city.code" |
||||
:label="city.value"> |
||||
</x-option> |
||||
</x-select> |
||||
</div> |
||||
</m-list-box> |
||||
<m-list-box> |
||||
<div slot="text">{{$t('Http Condition')}}</div> |
||||
<div slot="content"> |
||||
<x-input |
||||
:autosize="{minRows:2}" |
||||
:disabled="isDetails" |
||||
type="textarea" |
||||
v-model="condition" |
||||
:placeholder="$t('Please Enter Http Condition')" |
||||
autocomplete="off"> |
||||
</x-input> |
||||
</div> |
||||
</m-list-box> |
||||
<m-list-box> |
||||
<div slot="text">{{$t('Custom Parameters')}}</div> |
||||
<div slot="content"> |
||||
<m-local-params |
||||
ref="refLocalParams" |
||||
@on-local-params="_onLocalParams" |
||||
:udp-list="localParams" |
||||
:hide="false"> |
||||
</m-local-params> |
||||
</div> |
||||
</m-list-box> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import _ from 'lodash' |
||||
import i18n from '@/module/i18n' |
||||
import mLocalParams from './_source/localParams' |
||||
import mHttpParams from './_source/httpParams' |
||||
import mListBox from './_source/listBox' |
||||
import disabledState from '@/module/mixin/disabledState' |
||||
export default { |
||||
name: 'http', |
||||
data () { |
||||
return { |
||||
url: '', |
||||
condition: '', |
||||
localParams: [], |
||||
httpParams: [], |
||||
httpMethod: 'GET', |
||||
httpMethodList: [{ code: 'GET' }, { code: 'POST' }, { code: 'HEAD' }, { code: 'PUT' }, { code: 'DELETE' }], |
||||
httpCheckCondition: 'STATUS_CODE_DEFAULT', |
||||
httpCheckConditionList: [{ code: 'STATUS_CODE_DEFAULT',value:'默认响应码200' }, { code: 'STATUS_CODE_CUSTOM',value:'自定义响应码' }, { code: 'BODY_CONTAINS',value:'内容包含' }, { code: 'BODY_NOT_CONTAINS',value:'内容不包含' }] |
||||
} |
||||
}, |
||||
props: { |
||||
backfillItem: Object |
||||
}, |
||||
mixins: [disabledState], |
||||
methods: { |
||||
/** |
||||
* return localParams |
||||
*/ |
||||
_onLocalParams (a) { |
||||
this.localParams = a |
||||
}, |
||||
_onHttpParams (a) { |
||||
this.httpParams = a |
||||
}, |
||||
/** |
||||
* verification |
||||
*/ |
||||
_verification () { |
||||
if (!this.url) { |
||||
this.$message.warning(`${i18n.$t('Please Enter Http Url')}`) |
||||
return false |
||||
} |
||||
// localParams Subcomponent verification |
||||
if (!this.$refs.refLocalParams._verifProp()) { |
||||
return false |
||||
} |
||||
if (!this.$refs.refHttpParams._verifProp()) { |
||||
return false |
||||
} |
||||
if (!this.$refs.refHttpParams._verifValue()) { |
||||
return false |
||||
} |
||||
// storage |
||||
this.$emit('on-params', { |
||||
localParams: this.localParams, |
||||
httpParams: this.httpParams, |
||||
url: this.url, |
||||
httpMethod: this.httpMethod, |
||||
httpCheckCondition: this.httpCheckCondition, |
||||
condition: this.condition |
||||
}) |
||||
return true |
||||
} |
||||
}, |
||||
watch: { |
||||
}, |
||||
created () { |
||||
let o = this.backfillItem |
||||
// Non-null objects represent backfill |
||||
if (!_.isEmpty(o)) { |
||||
this.url = o.params.url || '' |
||||
this.httpMethod = o.params.httpMethod || 'GET' |
||||
this.httpCheckCondition = o.params.httpCheckCondition || 'DEFAULT' |
||||
this.condition = o.params.condition || '' |
||||
// backfill localParams |
||||
let localParams = o.params.localParams || [] |
||||
if (localParams.length) { |
||||
this.localParams = localParams |
||||
} |
||||
let httpParams = o.params.httpParams || [] |
||||
if (httpParams.length) { |
||||
this.httpParams = httpParams |
||||
} |
||||
} |
||||
}, |
||||
mounted () { |
||||
}, |
||||
components: { mLocalParams, mHttpParams, mListBox } |
||||
} |
||||
</script> |
After Width: | Height: | Size: 386 B |
Loading…
Reference in new issue