【问题标题】:Reading JSON response from sever1 and returning the same JSON as response for server3从 server1 读取 JSON 响应并返回与 server3 响应相同的 JSON
【发布时间】:2015-10-21 12:22:07
【问题描述】:

我有以下安排。

Server3 有一个 Codeigniter 应用程序在 server3 上运行。S3 使用类似这样的一些标头调用 s2

$parse_auth = $this->parse->login($result->email, $this->input->post('password'));

现在,在 S2 上,我有一个 python 脚本,它调用一个外部 Parse API,它返回 JSON 响应; 完整代码如下:

import SimpleHTTPServer
import SocketServer
import logging
import cgi
import urllib2
import json

PORT = 9500
headers = None
BASE_URL = 'https://api.parse.com'

class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):

def do_GET(self):
    SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
    args = self.path
    parse_url = BASE_URL+args
    opener = urllib2.build_opener()
    opener.addheaders = [('Accept', self.headers.getheader('Accept')),('X-Parse-Application-Id', self.headers.getheader('X-Parse-Application-Id')),('X-Parse-Client-Version', self.headers.getheader('X-Parse-Client-Version')),('X-Parse-REST-API-Key', self.headers.getheader('X-Parse-REST-API-Key'))]
    response = opener.open(parse_url)
    print response.read()
    self.send_response(200)
    self.send_header('Content-Type', 'application/json')
    self.end_headers()
    self.wfile.write(json.dumps(response.read()))// I tried without json.dumps, didn't work

def do_POST(self):
    form = cgi.FieldStorage(
        fp=self.rfile,
        headers=self.headers,
        environ={'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE':self.headers['Content-Type'],
                 })

    SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

Handler = ServerHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

当我在 s2 上打印来自 S1 的响应时,它显示为 JSON。

但是在 S3 上,当我打印数组 $parse_auth 我得到了

-1
Bad Request

我希望 S3 接收正确的 JSON 响应。怎么做。

提前致谢。

【问题讨论】:

  • 我在do_GET的第一行错误地调用了SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self),导致响应错误。

标签: php python json codeigniter


【解决方案1】:

首先,您总是必须使用 json.dumps() 或 jsonify() 来正确格式化传出的 JSON。但是对于您的问题,看起来这应该可行,但是您的 PHP 服务器在什么路由上接受请求?它可能与请求标头有关。

另外,您使用 python urllib 是否有原因?这些类型的问题正是 requests 模块旨在通过让您不必担心诸如请求标头之类的事情来防止的。

http://docs.python-requests.org/en/latest/

发送您的请求可能就这么简单。

>>> import requests
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2013-09-09
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多