2017-09-19 115 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