Golang中如何帮助处理JSON响应数据的发布

Golang中如何帮助处理JSON响应数据的发布 urlapi = https://yandex.ru/safety/check 待检查网站 = likegodak.club 内容类型 = json

请帮忙,我无法将响应读取到 YndexResponseModel 结构中 我这样做对吗?

现在响应始终为 nil

func main() {

result := CheckYandex("likegodak.club")
if result != nil {
	fmt.Println(result.Info, result.Url)
}

}    
func CheckYandex(site string) (status *YndexResponseModel) {
type (
	Threatstr struct {
		Threat string
	}
	YndexResponseModel struct {
		Info []Threatstr
		Url  string
	}

)
var (
	apiurl    string = "https://yandex.ru/safety/check"
	cl               = &http.Client{Timeout: 15 * time.Second}
	strformat        = fmt.Sprintf(`{"url": "%s"}`, site)
	jsonStr          = []byte(strformat)
)

r, err := http.NewRequest("POST", apiurl, bytes.NewBuffer(jsonStr))
r.Header.Set("content-type", "application/json")
r.Close = true
resp, err := cl.Do(r)
checkerror(err)
defer resp.Body.Close()

err = json.NewDecoder(resp.Body).Decode(status)

return status

更多关于Golang中如何帮助处理JSON响应数据的发布的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

请保持原始问题不变,并按您希望的方式回复。

更多关于Golang中如何帮助处理JSON响应数据的发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果你找到了解决方案,请在这里发布答案 🙂 也许其他人也遇到了类似的问题,你的解决方案可以帮助他们。

问题在于你声明了status作为返回值变量,但没有初始化它。在Go中,*YndexResponseModel类型的status默认值为nil,直接传递给json.Decoder.Decode()会导致解码失败。

以下是修正后的代码:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"time"
)

type Threatstr struct {
	Threat string `json:"threat"`
}

type YndexResponseModel struct {
	Info []Threatstr `json:"info"`
	Url  string      `json:"url"`
}

func main() {
	result := CheckYandex("likegodak.club")
	if result != nil {
		fmt.Println(result.Info, result.Url)
	}
}

func CheckYandex(site string) *YndexResponseModel {
	var (
		apiurl    string = "https://yandex.ru/safety/check"
		cl               = &http.Client{Timeout: 15 * time.Second}
		strformat        = fmt.Sprintf(`{"url": "%s"}`, site)
		jsonStr          = []byte(strformat)
	)

	r, err := http.NewRequest("POST", apiurl, bytes.NewBuffer(jsonStr))
	if err != nil {
		return nil
	}
	
	r.Header.Set("Content-Type", "application/json")
	r.Close = true
	
	resp, err := cl.Do(r)
	if err != nil {
		return nil
	}
	defer resp.Body.Close()

	var status YndexResponseModel
	err = json.NewDecoder(resp.Body).Decode(&status)
	if err != nil {
		return nil
	}

	return &status
}

主要修改:

  1. 将结构体定义移到函数外部,避免重复定义
  2. 添加JSON标签以正确映射字段
  3. 在函数内部创建status变量并传递其地址给解码器
  4. 添加错误处理,在请求失败或解码失败时返回nil
  5. 修正了Content-Type头的大小写

这样修改后,响应数据应该能正确解码到结构体中。

回到顶部