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

从超文本传输协议POST请求解组JSON

支洋
2023-03-14

我用Go编写了一个简单的服务器:

package main

import (
    "encoding/json"
    "fmt"
    "github.com/gorilla/mux"
    "io/ioutil"
    "net/http"
)

type Game struct {
    RID     string `json: "RID"`
    Country string `json: "Country"`
}

func postWaitingGames(w http.ResponseWriter, r *http.Request) {
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Println(err)
    }
    var game Game

    err = json.Unmarshal(body, &game)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%v\n", game)

    defer r.Body.Close()
}

func main() {
    router := mux.NewRouter()

    router.HandleFunc("/wait/", postWaitingGames).Methods("POST")

    http.ListenAndServe(":8081", router)
}

以及一个用Python编写的用于测试的简单客户端。以下是代码:

import json
import requests

json_to_send = json.dumps({"RID": "8", "Country": "Australia"})

post_headers = {'Content-type': 'application/json'}
addr = "http://127.0.0.1:8081/wait/"
resp = requests.post(url=addr, json=json_to_send, headers=post_headers)
print(resp.status_code)

每次客户端访问服务器时,服务器都会产生这个错误:

json: cannot unmarshal string into Go value of type main.Game

我知道如何在Go中处理JSON Post请求

Python版本==3.4 Go版本==1.7

先谢谢你。

共有2个答案

左丘凡
2023-03-14

所以,在下面的一些教程中,我遇到了解组错误,我认为使用请求有两个选项(当内容类型为JSON时):

payload = {
    "userId": "so_cool_user",
}

A.

requests.post(url=srvc_url, json=payload)

B:

requests.post(url=srvc_url, data=json.dumps(payload))
公西鸿博
2023-03-14

如果使用请求。post()json参数,必须向您传递Pythondict,而不是json序列化版本-请求将负责调用json。转储()。在这里,你的dict被序列化了两次。

另外,当使用json参数时,您不需要设置内容类型头,请求也会处理这个问题。

 类似资料:
  • 我正在使用GWT和Spring controller来管理http流量。有些请求可能需要很长时间,但我希望在超过给定时间时终止请求。 我如何配置超时Spring。我也使用Apache Tomcat 7.0。我试图在tomcat上inrease最大线程,但有一段时间tomcat工作缓慢,因为请求线程不会死。

  • 我有以下curl命令,它在bash shell中运行良好 我现在想通过一个简单的网页运行这个按钮点击。这是我的Javascript 但是当我通过网页按钮点击运行这个javascript时,它给我以下错误“网络错误:500内部服务器错误-http://ec2-54-226-250-92.compute-1.amazonaws.com:8080/ocr”,我的成功()方法永远不会被调用。 正如我所说,

  • 我有专有的基于http的API要从JMeter测试。不幸的是,API的一些endpoint希望http DELETE方法带有请求体(我知道它的API设计有问题,使用DELETE with request body,但我无法更改该API,需要对其进行测试)。 如何从JMeter测试它?似乎标准的HttpRequest采样器在没有任何警告的情况下默默忽略了我的身体有效载荷。(当我在《邮递员》中尝试它时

  • 我有以下伪代码 我想要的是,我循环遍历一个对象数组,每个对象都获得相关的用户和产品,然后订阅用户和产品。我怎么能那样做?

  • 我想知道你对这个概念的看法/意见。如果有替代方案?这是否可行/有益? 据我所知,对于每个http请求,服务器都会执行一些操作并返回http响应。 现在考虑任何场景,我们希望对服务器上运行的进程有更多的控制。 情景1:http请求发送- 在这里,资源被浪费了。 情况2:http请求发送- 在这里,客户端不知道服务器中运行的进程的状态。客户端必须等待,直到它获得超文本传输协议响应。 我的想法是:在初始

  • 我对Scala和Gatling完全陌生,请原谅基本问题! 我想用初始http请求的结果指定的创建一个http协议。换句话说: 以JSON的形式获取远程配置,比如从https://example.com/config.json 解析JSON,检索指定的属性 将该值传递给 我可以在每一个场景中手动执行此操作,但这很快就会变得乏味(而且是不必要的重复)。我想找到一个解决方案,我可以在测试运行开始时执行一