使用HTTPBuilder执行HTTP DELETE请求

时间:2015-07-30 16:41:55

标签: http groovy

我正在尝试使用Groovy HTTPBuilder库通过HTTP DELETE请求从Firebase中删除一些数据。如果我使用curl,则以下工作

curl -X DELETE https://my.firebase.io/users/bob.json?auth=my-secret

使用HTTPBuilder中的RESTClient类可以正常使用,如果我这样使用它:

def client = new RESTClient('https://my.firebase.io/users/bob.json?auth=my-secret')
def response = client.delete(requestContentType: ContentType.ANY)

然而,当我尝试将URL分解为其组成部分时,它不起作用

def client = new RESTClient('https://my.firebase.io')

def response = client.delete(
    requestContentType: ContentType.ANY,
    path: '/users/bob.json',
    query: [auth: 'my-secret']
)

我还尝试使用HTTPBuilder类而不是RESTClient

def http = new HTTPBuilder('https://my.firebase.io')

// perform a POST request, expecting TEXT response
http.request(Method.DELETE, ContentType.ANY) {
    uri.path = '/users/bob.json'
    uri.query = [auth: 'my-secret']

    // response handler for a success response code
    response.success = { resp, reader ->
        println "response status: ${resp.statusLine}"
    }
}

但这也行不通。当然有一种更优雅的方法,而不是把所有东西塞进一个字符串中?

1 个答案:

答案 0 :(得分:0)

有一个使用HttpURLClient in the tests进行删除的示例,其最简单的形式如下:

def http = new HttpURLClient(url:'https://some/path/')
resp = http.request(method:DELETE, contentType:JSON, path: "destroy/somewhere.json")
def json = resp.data
assert json.id != null
assert resp.statusLine.statusCode == 200

您的示例非常接近test for the delete in a HTTPBuilder

我看到的一些差异是:

  1. 你的道路是绝对的而不是相对的
  2. 您的http网址路径不以尾部斜杠结尾
  3. 您正在使用内容类型ANY,其中test使用JSON。目标是否需要内容类型正确? (可能不是因为你没有将它设置为卷曲示例,除非它代表你做一些伏都教)
  4. 或者您可以使用apache's HttpDelete但需要更多锅炉板。对于HTTP连接,这是我得到的一些代码。你必须为HTTPS修复它。

    def createClient() {
        HttpParams params = new BasicHttpParams()
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1)
        HttpProtocolParams.setContentCharset(params, "UTF-8")
        params.setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, true)
    
        SchemeRegistry registry = new SchemeRegistry()
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80))
    
        ClientConnectionManager ccm = new PoolingClientConnectionManager(registry)
        HttpConnectionParams.setConnectionTimeout(params, 8000)
        HttpConnectionParams.setSoTimeout(params, 5400000)
        HttpClient client = new DefaultHttpClient(ccm, params)
    
        return client
    }
    
    HttpClient client = createClient()
    def url  = new URL("http", host, Integer.parseInt(port), "/dyn/admin/nucleus$component/")
    HttpDelete delete = new HttpDelete(url.toURI())
    // if you have any basic auth, you can plug it in here
    def auth="USER:PASS"
    delete.setHeader("Authorization", "Basic ${auth.getBytes().encodeBase64().toString()}")
    
    // convert a data map to NVPs
    def data = [:]
    List<NameValuePair> nvps = new ArrayList<NameValuePair>(data.size())
    data.each { name, value ->
        nvps.add(new BasicNameValuePair(name, value))
    }
    
    delete.setEntity(new UrlEncodedFormEntity(nvps))
    
    HttpResponse response = client.execute(delete)
    def status = response.statusLine.statusCode
    def content = response.entity.content
    

    我从POST版本采用了上面的代码,但原理是一样的。