php小編蘋果為您帶來關(guān)于如何正確使用AnonFiles API發(fā)布文件的指南。AnonFiles API是一個(gè)強(qiáng)大的工具,可以幫助您快速、安全地上傳和分享文件。本指南將為您提供詳細(xì)的步驟和示例,幫助您輕松掌握API的使用方法。無論您是開發(fā)者還是普通用戶,都能從本指南中獲得實(shí)用的技巧和建議,讓您的文件分享體驗(yàn)更加順暢和高效。讓我們一起來探索AnonFiles API的魅力吧!
問題內(nèi)容
我正在嘗試創(chuàng)建一個(gè)函數(shù),使用 anonfiles api 在 anonfiles.com 網(wǎng)站上托管您的文件。即使我正確使用了 api,它總是返回 nil。 響應(yīng)缺少消息
。
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)) } }
登錄后復(fù)制
解決方法
我想花點(diǎn)時(shí)間將這些評(píng)論擴(kuò)展為答案。
首先,正如我們已經(jīng)討論過的,您沒有使用正確的 api 來上傳文件。如果我們修改您的代碼以顯示完整的響應(yīng)正文,如下所示:
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)
登錄后復(fù)制
我們看到以下內(nèi)容:
{ "status": false, "error": { "message": "no file chosen.", "type": "error_file_not_provided", "code": 10 } }
登錄后復(fù)制登錄后復(fù)制
我們收到此錯(cuò)誤是因?yàn)槟鷽]有在 multipart/form-data
請(qǐng)求中提供 file
參數(shù)。 我之前鏈接到的帖子有幾個(gè)示例發(fā)送多部分請(qǐng)求;我已經(jīng)測試了其中的幾個(gè),它們似乎按預(yù)期工作。
您還對(duì) api 返回的響應(yīng)做出了錯(cuò)誤的假設(shè)。如果我們使用 curl
發(fā)出成功的請(qǐng)求并捕獲響應(yīng) json,我們會(huì)發(fā)現(xiàn)它如下所示:
{ "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" } } } } }
登錄后復(fù)制
請(qǐng)注意,沒有 response["url"]
或 response["message"]
。如果您想要上傳文件的url,則需要獲取response["data"]["file"]["url"]["full"]
(或["short"]
)。
同樣,我們可以看到上面的錯(cuò)誤響應(yīng)示例,如下所示:
{ "status": false, "error": { "message": "no file chosen.", "type": "error_file_not_provided", "code": 10 } }
登錄后復(fù)制登錄后復(fù)制
這不是 result["message"]
;那是 result["error"]["message"]
。
因?yàn)槟饨M到 map[string] 接口
,所以獲取這些嵌套鍵會(huì)有點(diǎn)痛苦。我發(fā)現(xiàn)為上述響應(yīng)創(chuàng)建 go 結(jié)構(gòu)是最簡單的,只需將其解組為適當(dāng)類型的變量即可。
這讓我得到以下類型:
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"` } )
登錄后復(fù)制
然后解組響應(yīng)如下所示:
var result anonfilesresponse err = json.unmarshal(body, &result)
登錄后復(fù)制
我們可以請(qǐng)求以下字段:
fmt.Printf("URL: %s\n", result.Data.File.URL.Full)
登錄后復(fù)制