/* * HTTP Get/Post Test * * Licensed Virtual 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. * * Change History: * * Date Who What * ---- --- ---- * 2021-05-21 thebearmay Original version 0.1.0 * 2022-10-31 thebearmay add more options for headers, etc. * 2023-09-27 Add text=parser option * 2023-09-28 XML to JSON * */ import groovy.transform.Field import groovy.json.JsonOutput static String version() { return '0.2.3' } metadata { definition ( name: "HttpGetPost Tester", namespace: "thebearmay", author: "Jean P. May, Jr.", importUrl: "https://raw.githubusercontent.com/thebearmay/hubitat/main/httpTester.groovy" ) { capability "Actuator" attribute "respReturn", "string" command "send" } } preferences { input "postGet", "enum", title: "POST or GET", options:["POST","GET"], submitOnChange: true input "path", "string", title: "Server Path (including port)", submitOnChange: true input "contentT", "string", title: "Content Type", required:true, submitOnChange: true input "contentR", "string", title: "Request Content Type", submitOnChange: true input "headerBlock", "string", title: "Headers, comma separated", submitOnChange: true input "bodyText", "string", title: "Body text (usually JSON)" input "tParser", "bool", title: "Text Parser", submitOnChange: true, defaultValue:true input("debugEnable", "bool", title: "Enable debug logging?") input("security", "bool", title: "Hub Security Enabled", defaultValue: false, submitOnChange: true) if (security) { input("username", "string", title: "Hub Security Username", required: false) input("password", "password", title: "Hub Security Password", required: false) } } def installed() { log.trace "installed()" } def configure() { if(debugEnable) log.debug "configure()" updateAttr("getReturn"," ") } def updateAttr(aKey, aValue){ sendEvent(name:aKey, value:aValue) } def updateAttr(aKey, aValue, aUnit){ sendEvent(name:aKey, value:aValue, unit:aUnit) } def initialize(){ } def send(){ if(security) { httpPost( [ uri: "http://127.0.0.1:8080", path: "/login", query: [ loginRedirect: "/" ], body: [ username: username, password: password, submit: "Login" ] ] ) { resp -> cookie = resp?.headers?.'Set-Cookie'?.split(';')?.getAt(0) } } sendEvent(name:"respReturn",value:".") params = [ uri: path, contentType: "$contentT", requestContentType: contentR ?"$contentR" : "*/*", textParser: tParser ? "true":"$tParser", headers: [:] ] if(cookie) params.headers.put("Cookie", cookie) if(headerBlock != null){ headerList = headerBlock.split(",") headerList.each{ itList = it.split(":") params.headers.put("${itList[0]}", "${itList[1]}") } } if(bodyText) params.put("body", "$bodyText") if(debugEnabled) log.debug "$postGet $params" if(postGet == "POST") asynchttpPost("sendHandler", params) else asynchttpGet("sendHandler", params) } def sendHandler(resp, data) { if(debugEnabled) log.debug "Response: ${resp.properties}" def xmlStr=""" {adasdasdasdae-3421-dase-1dd} 324234 """ try { if(resp.getStatus() == 200 || resp.getStatus() == 207) { strWork = resp.data.toString() if(debugEnable) log.debug "$strWork
Type:${resp.headers["Content-Type"]}" if(resp.headers["Content-Type"].contains("xml")) { //strWork = xmlStr xmlNodes= new XmlParser().parseText(strWork)//.children() mapVal=[:] if(xmlNodes.attributes()) mapVal+=xmlNodes.attributes() xmlNodes.each { aMap=[:] cMap=[:] it.children().each { if(!it.class.toString().contains('String')) cMap.put(it?.name(),it.value().toString().replace("[","").replace("]","")) else cMap.put("value",it.value.toString().replace("[","").replace("]","")) } if(it.attributes()){ sWork = it?.name()+it.attributes().toString().replace("[","_").replace(":","_").replace("]","") mapVal.put(sWork,cMap) } else if(it?.name()) mapVal.put(it?.name(),cMap) else mapVal+=cMap } if (debugEnabled) log.debug "${mapVal}" strWork = JsonOutput.toJson(mapVal) } sendEvent(name:"respReturn",value:strWork) } } catch(Exception ex) { log.error "$ex" } } def updated(){ log.trace "updated()" if(debugEnable) runIn(1800,logsOff) } void logsOff(){ device.updateSetting("debugEnable",[value:"false",type:"bool"]) }