2013-05-30 16 views
1

對不起,要求一個可能愚蠢的問題,但在閱讀文檔,看例子等,我仍然沒有找到我想要做的解決方案。嘗試使用ZnServer的GET和POST請求

我使用Pythons web服務器作爲大型項目的一部分。它通過do_GET方法提供靜態文件,並可以通過do_POST方法處理POST請求(由客戶端使用XMLHTTPRequest發送)。一切都很好。

我想要做的是在Pharo中的Web服務器的實現。我認爲ZnServer(Pharo 2.0的一部分)是要走的路。它必須能夠提供靜態文件並處理POST請求。

一個非常簡單的HTTP服務器示例Python代碼

# httpd_test.py 

# Imports 
import os 
import sys 
import cgi 
import json 
from BaseHTTPServer import BaseHTTPRequestHandler 
from BaseHTTPServer import HTTPServer 

# HTTP Request Handler Class 
class RequestHandler(BaseHTTPRequestHandler): 

    # Process GET requests 
    def do_GET(self): 

     print(self.path) 

     # Send response 
     tex = 'GET: ' + self.path 
     self.send_response(200) 
     self.send_header('Content-type','text/plain') 
     self.send_header('Content-length',str(len(tex))) 
     self.end_headers() 
     self.wfile.write(tex) 
     self.wfile.flush() 

    # Process POST requests 
    def do_POST(self): 

     # Read CGI data 
     CgiData = cgi.FieldStorage(fp  = self.rfile, 
           headers = self.headers, 
           environ = {'REQUEST_METHOD':'POST', 
              'CONTENT_TYPE':self.headers['Content-Type']}) 

     # Invoke action 
     if self.path == '/handler': 
     print(repr(CgiData)) 
     else: 
     print('Unknown POST handler.') 
     print(repr(CgiData)) 

     # Send response 
     self.send_response(200) 
     tex = repr(CgiData) 
     self.send_header('Content-type','text/plain') 
     self.send_header('Content-length',str(len(tex))) 
     self.end_headers() 
     self.wfile.write(tex) 
     self.wfile.flush() 

# Start Server 
if __name__ == '__main__': 
    server = HTTPServer(('127.0.0.1',8080),RequestHandler) 
    server.serve_forever() 

我已經在菲羅(但沒有運氣)

start 
    "Start ZnServer default" 

    | staticFileServerDelegate | 

    ZnServer startDefaultOn: 8080. 

    (ZnServer default) logToTranscript. 

    (ZnServer default) authenticator: (ZnBasicAuthenticator username: 'foo' password: 'bar'). 

    staticFileServerDelegate := ZnStaticFileServerDelegate new. 
    staticFileServerDelegate prefixFromString: 'zn'; 
              directory: 'C:\Temp'. 

" (ZnServer default) delegate prefixMap 
     at: 'zn' 
     put: [ :request | staticFileServerDelegate handleRequest: request ]; 
     at: '/' 
     put: [ :request | ZnResponse redirect: 'C:\Temp' ]." 

    (ZnServer default) delegate prefixMap 
     at: '/' 
     put: [ :request | Transcript cr; show:'1 '; show: request; cr. ]; 
     at: 'handler' 
     put: [ :request | Transcript cr; show:'3 '; show: request; cr. ]. 

「開始」 嘗試是一個類的方法一個沒有基類的自己的類。

我是法羅的新手,所以有可能我走錯了路。 我希望,描述足夠清楚,所以人們可以看到我想要做什麼。 任何幫助,將不勝感激。

在此先感謝。

回答

0

作爲默認的服務器,這應該工作:

(ZnServer startDefaultOn: 8080) 
    onRequestRespond: [ :request | 
     ZnResponse ok: (ZnEntity text: 'Hiya!') ]. 

然後你就可以管理文件回答了ZnResponse。但爲什麼你不使用像Seaside這樣更強大的東西? http://seaside.st

+0

非常感謝您的回答。 – Martin

+0

對不起,忘了回答你關於海邊的問題。 Seaside是一個完整的Web應用程序框架。這對我在Pharo中嘗試做的事情來說太大了(已經在Python中完成了)。 – Martin