2017-09-19 72 views
1

我在一個Golang項目中工作,我需要通過外部API執行一些操作:GET,PUT,POST和DELETE。目前正在使用net/http我創建了一個&http.Client{}來進行GET和PUT,即按預期工作。從golang消費DELETE端點

現在我需要執行一個DELETE,我找不到任何關於它的東西,它是否支持?我需要基本上調用這樣的網址:

somedomain.com/theresource/:id 
Method: DELETE 

我該如何執行該操作?

+3

那麼,你如何執行'PUT'要求?如何使一個'PUT'請求與創建一個'DELETE'不同? – zerkms

+0

只是一個猜測,但如果你的代碼沒有收到'DELETE'請求,你可能需要配置CORS(https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS)。 CORS做的基本上是發送一個'OPTIONS'請求,要求發送'DELETE'請求的權限。如果您從瀏覽器發送請求,會發生這種情況。您可以嘗試使用'curl'或'postman'等工具來確保發送實際的DELETE請求。另外,如果事實證明是問題所在,你可以使用像Gorilla這樣的Go框架來正確處理CORS。 –

+0

@MichałCORS僅適用於客戶端發起的請求。 OP從服務器端應用程序執行http請求,因此CORS不適用。 – zerkms

回答

2

這裏是如何做到這一點的一個小例子:

package main 

import (
    "fmt" 
    "io/ioutil" 
    "net/http" 
) 

func sendRequest() { 
    // Request (DELETE http://www.example.com/bucket/sample) 

    // Create client 
    client := &http.Client{} 

    // Create request 
    req, err := http.NewRequest("DELETE", "http://www.example.com/bucket/sample", nil) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 

    // Fetch Request 
    resp, err := client.Do(req) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    defer resp.Body.Close() 

    // Read Response Body 
    respBody, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 

    // Display Results 
    fmt.Println("response Status : ", resp.Status) 
    fmt.Println("response Headers : ", resp.Header) 
    fmt.Println("response Body : ", string(respBody)) 
} 
+0

我認爲這是一個很好的答案,但我會建議(爲了幫助OP避免問題的下行)改變幾件事情:[關閉響應機構](http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/#anameclose_http_resp_bodyaclosinghttpresponsebody)和[請求完成後關閉連接](http://devs.cloudimmunity.com/陷阱和常見-錯誤 - 在-GO-golang /#anameclose_http_connaclosinghttpconnections)。有幾種情況你不想用同樣的功能做這些事情,但我通常需要。 – Jonathan

+0

@Jonathan:其中一些例子不正確,你應該遵循官方文檔。是的,你應該總是關閉響應主體,但是_always_先檢查錯誤,然後推遲;在出現錯誤的情況下,響應對象不保證有效。你通常也不應該關閉請求。 – JimB

+0

@JimB:感謝您的反饋和您的想法。關於官方文檔的好處 - 我仔細研究了該頁面上的其他一些建議,並認爲它們是在1.5之前編寫的。當然,一些古老的東西可能會有一些有用的信息塊,但當它們不符合當前的官方文檔時,並不適合在這種環境中分享。謝謝 – Jonathan