Проблема с ответом JSON в Python REST-сервере я пишу - PullRequest
2 голосов
/ 28 ноября 2010

Для собственного образования я создаю простой демон, который будет функционировать как REST-сервер, прослушивающий сокет 9000. Для моего первого теста я пытаюсь сделать вызов REST, просто выполнив GET на http://localhost:9000/getsettings.json.

Простой взломанный сервер получает запрос в порядке, но я думаю, что есть проблема с ответом, который он отправляет. Я пытаюсь отправить ответ как JSON. Код для сокета сервера ниже. Ниже приведен код jQuery, который я использую для выполнения запроса JSON. Оператор print на сервере Python выводит действительный набор настроек в формате JSON. Ни одно предупреждение в Javascript не вызывается при загрузке страницы. Есть идеи?

<code>
Python:
    def socketThread(self):
        while 1:
            sock, address = self.serverSocket.accept()
            fs = sock.makefile()
            line = fs.readline();
            if line.startswith('GET /settings.json'):
                sock.sendall("HTTP/1.0 200 OK\r\n")
                sock.sendall("Content-Type: application/json\r\n")
                settings = json.dumps(self.currentSettings) #, indent=4
                sock.sendall("Content-Length: " + str(len(settings)) + '\r\n\r\n')
                sock.sendall(settings)
                print settings
                sock.close()</p>

<p>Javascript:
$(document).ready(function() {
    $.ajax({
        url: 'http://localhost:8080/settings.json',
        cache: false,
        success: function(json){
            alert('json success ' + json);
        },
        error: function(xhr, textStatus, errorThrown) {
            alert(xhr.statusText);
        }
    });
});

Ответы [ 3 ]

3 голосов
/ 28 ноября 2010

Вам необходимо вернуть 200 OK HTTP-ответ и пустую строку перед отправкой вашего контента.

Возможно, вам также понадобятся некоторые HTTP-заголовки (Content-type будет очевидным).1005 *

Однако я бы порекомендовал использовать одну из многих HTTP-библиотек Python вместо самостоятельной реализации протокола.

2 голосов
/ 28 ноября 2010

Проверьте, что сервер действительно поражен (например, вставьте import pdb; pdb.set_trace() в ваш код. Я обнаружил, что jQuery выполняет обратный вызов успеха с пустым телом, когда сервер не работает (или прослушивает другой порт ...)

1 голос
/ 28 ноября 2010

ОК, проблема была на стороне jQuery, мой запрос был заблокирован проблемой защиты от междоменного происхождения - мой запрос шел на localhost на другом порту, поэтому jQuery не обрабатывал данные. Теперь мне нужно выяснить, как заставить это работать. Спасибо за помощь, ребята.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...