Eu preciso postar um JSON de um cliente para um servidor. Estou usando o Python 2.7.1 e simplejson. O cliente está usando solicitações. O servidor é CherryPy. Posso OBTER um JSON codificado no servidor (código não mostrado), mas quando tento POSTAR um JSON para o servidor, recebo "400 Bad Request".
Aqui está o meu código de cliente:
data = {'sender': 'Alice',
'receiver': 'Bob',
'message': 'We did it!'}
data_json = simplejson.dumps(data)
payload = {'json_payload': data_json}
r = requests.post("http://localhost:8080", data=payload)
Aqui está o código do servidor.
class Root(object):
def __init__(self, content):
self.content = content
print self.content # this works
exposed = True
def GET(self):
cherrypy.response.headers['Content-Type'] = 'application/json'
return simplejson.dumps(self.content)
def POST(self):
self.content = simplejson.loads(cherrypy.request.body.read())
Alguma ideia?
python
json
python-requests
cherrypy
Charles R
fonte
fonte
__init__
métodos de classe com umcontent
argumento (e não afirma no link que você forneceu). No exemplo detalhado que eles têm, o usuário fornece o código que chama__init__
e fornece os argumentos, que não vimos aqui, então não faço ideia do estado do seu objeto quando o seu# this works
comentário é relevante.cherrypy.quickstart(Root(), '/', conf)
.Respostas:
A partir da versão 2.4.2 e posteriores, você pode usar o parâmetro 'json' como alternativa na chamada, o que simplifica.
EDIT: Este recurso foi adicionado à documentação oficial. Você pode visualizá-lo aqui: Solicita a documentação
fonte
json
parâmetro. Eu tive que entrar no Github antes de ver qualquer menção a ele: github.com/kennethreitz/requests/blob/…Acontece que eu estava perdendo as informações do cabeçalho. Os seguintes trabalhos:
fonte
application/json
emGET
e de alguma forma perdeu que não lhe tinha fornecido a pedido. Você também pode precisar se certificar de retornar algoPOST
ou obter um500
.r
, recebo<Response [200]>
.json.dumps
aqui. Odata
parâmetrorequests
funciona bem com dicionários. Não há necessidade de converter em uma string.Nas solicitações 2.4.2 ( https://pypi.python.org/pypi/requests ), o parâmetro "json" é suportado. Não há necessidade de especificar "Tipo de Conteúdo". Portanto, a versão mais curta:
fonte
A melhor maneira é:
fonte
Content-type: application/json
é redundante como ojson=
já sugere isso.Content-type
text/html; charset=UTF-8
. Então acima não vai funcionar?Funciona perfeitamente com python 3.5+
cliente:
servidor:
fonte
Qual parâmetro entre (data / json / files) deve ser usado, na verdade depende de um cabeçalho de solicitação chamado ContentType (geralmente verifique isso nas ferramentas de desenvolvedor do seu navegador),
quando o Tipo de conteúdo é application / x-www-form-urlencoded, o código deve ser:
quando o Content-Type é application / json, seu código deve ser um dos seguintes:
quando o Content-Type é multipart / form-data, é usado para fazer upload de arquivos; portanto, seu código deve ser:
fonte