Ошибка при отправке сообщения из программы на C # с сервером, использующим Twisted python - PullRequest
0 голосов
/ 08 декабря 2011

Мой метод отправки сообщения на сервер с использованием C # .NET 4.0

 private String postHTTP(String url)
    {
        String result = "";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        string postData = "Data has Posted";
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        **request.ContentType = "application/x-www-form-urlencoded";**
        request.Credentials = System.Net.CredentialCache.DefaultCredentials;
        request.ContentLength = byteArray.Length;
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
        WebResponse response = request.GetResponse();
        txtWebServerStatus.Text = ((HttpWebResponse)response).StatusDescription;
        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        // Display the content.
        Console.WriteLine(responseFromServer);
        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();
        return responseFromServer;
    }

Мой серверный код для предоставления формы для ввода и печати того, что вы печатаете в форме

from twisted.web.server import Site   
from twisted.web.resource import Resource
from twisted.internet import reactor
from twisted.web.error import NoResource   
import cgi

  class DynamicPage(Resource): 
    def render_GET(self, request):  
        return '<html><body><form method="POST"><input name="the-field" type="text" /></form></body></html>'

    def render_POST(self, request):        
        return '<html><body>You submitted: %s</body></html>' % (cgi.escape(request.args["the-field"][0]),)

root = Resource()   
dynamic = DynamicPage()    
root.putChild("fool", dynamic)
factory = Site(root)
reactor.listenTCP(7777, factory)
reactor.run()

Ошибка метода записи: в строке WebResponse response = request.GetResponse();

Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

При использовании метода записи возникает ошибка насервер:

C:\Users\sepdau>C:\Python27\python.exe E:\server.py
Unhandled Error Traceback (most recent call last):

  File "C:\Python27\lib\site-packages\twisted\web\http.py", line 1349, in dataReceived  finishCallback(data[contentLength:])

  File "C:\Python27\lib\site-packages\twisted\web\http.py", line 1563, in _finishRequestBodyself.allContentReceived()

  File "C:\Python27\lib\site-packages\twisted\web\http.py", line 1618, in allContentReceived req.requestReceived(command, path, version)

  File "C:\Python27\lib\site-packages\twisted\web\http.py", line 773, in request Received self.process()

--- <exception caught here> ---

  File "C:\Python27\lib\site-packages\twisted\web\server.py", line 132, in process
    self.render(resrc)

  File "C:\Python27\lib\site-packages\twisted\web\server.py", line 167, in render
    body = resrc.render(self)

  File "C:\Python27\lib\site-packages\twisted\web\resource.py", line 216, in render
    return m(request)

  **File "E:\server.py", line 25, in render_POST
    return '<html><body>You submitted: %s</body></html>' % (cgi.escape(request.a
rgs["the-field"][0]),)
exceptions.KeyError: 'the-field'**

Я думаю, что ошибка на сервере или ContentType я использую не правильно.Вы можете мне помочь.Спасибо за продвижение.

1 Ответ

1 голос
/ 08 декабря 2011

Итак, проблема, с которой вы сталкиваетесь:

KeyError: 'the-field'

Это потому, что ваш клиент публикует:

Data has Posted

В данных поста нет полей формы. Есть две вещи, которые вы, вероятно, хотите сделать.

Во-первых, сделайте свой сервер более устойчивым к некорректным вводам. Это уже несколько надежно: неправильный ввод генерирует 500, но сервер продолжает работать и обрабатывать будущие запросы. Возможно, вы захотите создать более полезную страницу ошибок, чтобы помочь клиентам понять, что они делают неправильно. Итак, попробуйте обработать KeyError:

def render_POST(self, request):        
    try:
        value = request.args["the-field"][0]
    except KeyError:
        value = "<missing the-field value>"
    return '<html><body>You submitted: %s</body></html>' % (cgi.escape(value),)

Теперь ваш клиент должен получить ответ 200, даже если он продолжает отправлять данные формы без поля формы, которое ищет сервер.

Далее исправьте ваш клиент, чтобы он отправлял данные поста, которые содержат правильные поля формы. Попробуйте строку вроде:

the-field=%5B%27some+value%27%5D

Вы можете сгенерировать это в Python, используя urllib.urlencode, например:

urllib.urlencode({'the-field': ['some value']})
...