php小編蘋果為您帶來關于如何正確使用AnonFiles API發布文件的指南。AnonFiles API是一個強大的工具,可以幫助您快速、安全地上傳和分享文件。本指南將為您提供詳細的步驟和示例,幫助您輕松掌握API的使用方法。無論您是開發者還是普通用戶,都能從本指南中獲得實用的技巧和建議,讓您的文件分享體驗更加順暢和高效。讓我們一起來探索AnonFiles API的魅力吧!
問題內容
我正在嘗試創建一個函數,使用 anonfiles api 在 anonfiles.com 網站上托管您的文件。即使我正確使用了 api,它總是返回 nil。 響應缺少消息。
func host(file string) {
fileBytes, err := ioutil.ReadFile(file)
if err != nil {
fmt.Println("\033[1;31mCommand > Host: Could not read file,", err, "\033[0m")
return
}
url := "https://api.anonfiles.com/upload"
request, err := http.NewRequest("POST", url, bytes.NewBuffer(fileBytes))
if err != nil {
fmt.Println("\033[1;31mCommand > Host: Could not post request,", err, "\033[0m")
return
}
request.Header.Set("Content-Type", "application/octet-stream")
client := &http.Client{}
response, err := client.Do(request)
if err != nil {
fmt.Println("\033[1;31mCommand > Host: Could not send request,", err, "\033[0m")
return
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Println("\033[1;31mCommand > Host: Could not read response,", err, "\033[0m")
return
}
var result map[string]interface{}
err = json.Unmarshal(body, &result)
if err != nil {
fmt.Println("\033[1;31mCommand > Host: Could not parse response,", err, "\033[0m")
return
}
if response.StatusCode == 200 {
if result["url"] == nil {
fmt.Println("\033[1;31mCommand > Host: Response is missing URL\033[0m")
return
}
fmt.Println("File hosted successfully:", result["url"].(string))
} else {
if result["message"] == nil {
fmt.Println("\033[1;31mCommand > Host: Response is missing message\033[0m")
return
}
fmt.Println("\033[1;31mCommand > Host:\033[0m", result["message"].(string))
}
}
登錄后復制
解決方法
我想花點時間將這些評論擴展為答案。
首先,正如我們已經討論過的,您沒有使用正確的 api 來上傳文件。如果我們修改您的代碼以顯示完整的響應正文,如下所示:
client := &http.client{}
response, err := client.do(request)
if err != nil {
fmt.println("\033[1;31mcommand > host: could not send request,", err, "\033[0m")
return
}
defer response.body.close()
body, err := ioutil.readall(response.body)
if err != nil {
fmt.println("\033[1;31mcommand > host: could not read response,", err, "\033[0m")
return
}
fmt.printf("body:\n%s\n", body)
登錄后復制
我們看到以下內容:
{
"status": false,
"error": {
"message": "no file chosen.",
"type": "error_file_not_provided",
"code": 10
}
}
登錄后復制登錄后復制
我們收到此錯誤是因為您沒有在 multipart/form-data 請求中提供 file 參數。 我之前鏈接到的帖子有幾個示例發送多部分請求;我已經測試了其中的幾個,它們似乎按預期工作。
您還對 api 返回的響應做出了錯誤的假設。如果我們使用 curl 發出成功的請求并捕獲響應 json,我們會發現它如下所示:
{
"status": true,
"data": {
"file": {
"url": {
"full": "https://anonfiles.com/k8cdobwey7/test_txt",
"short": "https://anonfiles.com/k8cdobwey7"
},
"metadata": {
"id": "k8cdobwey7",
"name": "test.txt",
"size": {
"bytes": 12,
"readable": "12 b"
}
}
}
}
}
登錄后復制
請注意,沒有 response["url"] 或 response["message"]。如果您想要上傳文件的url,則需要獲取response["data"]["file"]["url"]["full"](或["short"])。
同樣,我們可以看到上面的錯誤響應示例,如下所示:
{
"status": false,
"error": {
"message": "no file chosen.",
"type": "error_file_not_provided",
"code": 10
}
}
登錄后復制登錄后復制
這不是 result["message"];那是 result["error"]["message"]。
因為您要解組到 map[string] 接口 ,所以獲取這些嵌套鍵會有點痛苦。我發現為上述響應創建 go 結構是最簡單的,只需將其解組為適當類型的變量即可。
這讓我得到以下類型:
type (
anonfilesurl struct {
full string `json:"full"`
short string `json:"short"`
}
anonfilesmetadata struct {
id string `json:"id"`
name string `json:"name"`
size struct {
bytes int `json:"bytes"`
readable string `json:"readable"`
} `json:"size"`
}
anonfilesdata struct {
file struct {
url anonfilesurl `json:"url"`
metadata anonfilesmetadata `json:"metadata"`
} `json:"file"`
}
anonfileserror struct {
message string
type string
code int
}
anonfilesresponse struct {
status bool `json:"status"`
data anonfilesdata `json:"data"`
error anonfileserror `json:"error"`
}
)
登錄后復制
然后解組響應如下所示:
var result anonfilesresponse err = json.unmarshal(body, &result)
登錄后復制
我們可以請求以下字段:
fmt.Printf("URL: %s\n", result.Data.File.URL.Full)
登錄后復制






