当前位置: 首页 > 知识库问答 >
问题:

Golang API编码问题

马国源
2023-03-14

我正在尝试通过golang使用JSON API,但是在获得响应时遇到了可怕的时间。我正在使用示例 JSON 终结点 http://jsonplaceholder.typicode.com/posts/1,该终结点返回

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

这是我的代码,来自这个堆栈溢出答案:

package main

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

type Post struct {
    UserID string
    ID string
    Title string
    Body string
}

func getJson(url string, target interface{}) error {
    r, err := http.Get(url)
    if err != nil {
        return err
    }
    defer r.Body.Close()
    fmt.Println(r)
    return json.NewDecoder(r.Body).Decode(target)
}

func main() {
    post := new(Post) // or &Foo{}
    getJson("http://jsonplaceholder.typicode.com/posts/1", &post)
    println(post.Body)

}

这是输出:

go run main.go 
&{200 OK 200 HTTP/1.1 1 1 map[Cf-Cache-Status:[HIT] Cf-Ray:[2bf857d2e55e0d91-SJC] Access-Control-Allow-Credentials:[true] Cache-Control:[public, max-age=14400] Expires:[Sat, 09 Jul 2016 06:28:31 GMT] X-Content-Type-Options:[nosniff] Server:[cloudflare-nginx] Date:[Sat, 09 Jul 2016 02:28:31 GMT] Connection:[keep-alive] X-Powered-By:[Express] Etag:[W/"124-yv65LoT2uMHrpn06wNpAcQ"] Content-Type:[application/json; charset=utf-8] Set-Cookie:[__cfduid=d0c4aacaa5db8dc73c59a530f3d7532af1468031311; expires=Sun, 09-Jul-17 02:28:31 GMT; path=/; domain=.typicode.com; HttpOnly] Pragma:[no-cache] Via:[1.1 vegur] Vary:[Accept-Encoding]] 0xc8200ee100 -1 [chunked] false map[] 0xc8200da000 <nil>}

我知道endpoint有效。这是编码问题还是其他问题?我在Mac OSX 10.11.15上。

谢谢

共有2个答案

寿高阳
2023-03-14

也许你应该试试这个:

package main

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

type Result struct {
    UserID int    `json:"userId"`
    ID     int    `json:"id"`
    Title  string `json:"title"`
    Body   string `json:"body"`
}   

func main() {

    url := "http://jsonplaceholder.typicode.com/posts/1"

    req, _ := http.NewRequest("GET", url, nil)

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    var result Result
    err := json.Unmarshal(body, &result)
    if err != nil {
        fmt.Println(err)
    }   

    fmt.Println(res)
    fmt.Println(string(body))

    fmt.Println(result)
    //fmt.Println(result.Title)
    //fmt.Println(result.Body)
}

你会得到一个结果结构

庞乐池
2023-03-14

您在 unmarshal 中有错误: 如果打印错误,则无法将元组数字解构为字符串类型的 Go 值。UserId 和 Id 应该是 int。

请不要忽略错误!

尝试此代码:

package main

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

type Post struct {
    UserID int
    ID     int
    Title  string
    Body   string
}

func getJson(url string, target interface{}) error {
    r, err := http.Get(url)
    if err != nil {
        return err
    }
    defer r.Body.Close()
    fmt.Println(r)
    return json.NewDecoder(r.Body).Decode(target)
}

func main() {
    post := new(Post) // or &Foo{}
    err := getJson("http://jsonplaceholder.typicode.com/posts/1", &post)
    if err != nil {
        panic(err)
    }

    println(post.Body)
    fmt.Printf("Post: %+v\n", post)
}

已编辑:为什么无法打印出响应体的内容,在命令行中也能看到?它被编码了吗?Ans: HTTP请求或响应曾经采用由响应头字段定义的格式或编码。

响应体是通过解码任何可能用于确保消息安全和正确传输的传输编码从消息体中获得的。

如果您打印:fmt.Println("Header:%#v\n",r.Header)
您将看到,Content-Type:[application/json; charset=utf-8]这就是为什么您使用Json进行解码。它也可以是xml。

 类似资料:
  • 最近,我们正在将java构建作业从serverA迁移到serverB,java源代码(包含中文字符)在使用Ant的原始serverA上编译良好( ),但是,当我们将相同的代码签出到新的serverB并运行相同的Ant脚本时,出现了编码错误,如“用于编码GBK的Unmappable character”(Unmappable character for encoding GBK)。(JDK版本相同)

  • 我有一个(非常简单的)java Spring Boot/REST服务,它从输入中呈现PDF并使用IntelliJ对其进行测试。 我使用pdfbox作为创建此类pdf的工具。 一个特点是,除了它想要的常规内容外,客户端还可以将附件作为字节[]提供。 当用户尝试该服务时,最终文档只有附件部分的空白页。 使用IntelliJ和HTTP REST客户端进行了尝试,但遇到了相同的问题 当我注意到使用post

  • 当从其中一个web服务获取数据时,引号(“)将显示为(?)当我使用Rest模板时。我在chrome上的postman中测试了web服务,并给出了正确的字符。我尝试编码UTF-8,但没有成功。 我检查了以下是从Web服务提供商编码: 高速缓存控制→私有连接→关闭内容编码→gzip内容长度→3407内容类型→text/xml; charset=ISO-8859-1日期→周三,2015 13:35:53

  • 问题内容: 我尝试使用java.io.FileReader读取一些文本文件并将其转换为字符串,但是我发现结果编码错误并且根本不可读。 这是我的环境: Windows 2003,操作系统编码:CP1252 Java 5.0 我的文件是UTF-8编码或CP1252编码的,其中一些(UTF-8编码的文件)可能包含中文(非拉丁)字符。 我使用以下代码来完成我的工作: 上面的代码不起作用。我发现FileRe

  • 我在gradle运行junit测试时遇到了一个问题。从stacktrace来看,这似乎是一个编码问题。 我已将编码设置为 谢谢

  • 我有这样一个csv文件 我在读书