Клиент C # для использования RESTful веб-службы Google App Engine (rpc XML) - PullRequest
0 голосов
/ 23 апреля 2010

Мне кажется, я столкнулся с проблемой при использовании клиента C # для использования веб-службы Google App Engine. Код Google App Engine, который я использую , находится здесь . Вот как будет выглядеть скрипт Python на сервере:

from google.appengine.ext import webapp                                        
from google.appengine.ext.webapp.util import run_wsgi_app                      
import logging                                                                 

from StringIO import StringIO                                                  
import traceback
import xmlrpclib
from xmlrpcserver import XmlRpcServer

class Application:
    def __init__(self):
        pass                    

    def getName(self,meta):                                                    
        return 'example'

class XMLRpcHandler(webapp.RequestHandler):                                    
    rpcserver = None

    def __init__(self):         
        self.rpcserver = XmlRpcServer()                                        
        app = Application()                                                    
        self.rpcserver.register_class('app',app)                               

    def post(self):
        request = StringIO(self.request.body)
        request.seek(0)                                                        
        response = StringIO()                                                  
        try:
            self.rpcserver.execute(request, response, None)                    
        except Exception, e:                                                   
            logging.error('Error executing: '+str(e))                          
            for line in traceback.format_exc().split('\n'):                    
                logging.error(line)
        finally:
            response.seek(0)  

        rstr = response.read()                                                 
        self.response.headers['Content-type'] = 'text/xml'                     
        self.response.headers['Content-length'] = "%d"%len(rstr)               
        self.response.out.write(rstr)

application = webapp.WSGIApplication(                                          
                                     [('/xmlrpc/', XMLRpcHandler)],
                                     debug=True)                               
def main():
  run_wsgi_app(application)                                                    

if __name__ == "__main__":
    main()

На стороне клиента (в Python) это:

import xmlrpclib
s = xmlrpclib.Server('http://localhost:8080/xmlrpc/')
print s.app.getName()

У меня нет проблем с использованием клиента Python для получения значений из Google App Engine, но у меня возникают трудности при использовании клиента C # для получения значений. Ошибка, которую я получил, была 404 method not found, когда я пытаюсь GetResponse из веб-запроса.

Это мой код

        var request = (HttpWebRequest)WebRequest.Create("http://localhost:8080/xmlrpc/app");

        request.Method = "GET";
        request.ContentLength = 0;
        request.ContentType = "text/xml";
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) //404 method not found error here.
        {

        }  

Редактировать: Для конечных точек я пробовал:

  1. http://localhost:8080/xmlrpc
  2. http://localhost:8080/xmlrpc/
  3. http://localhost:8080/xmlrpc/app
  4. http://localhost:8080/xmlrpc/app/

Но ни один не работает

Я думаю, что URL-адрес неправильный, но я не знаю, как сделать это правильно. Есть идеи?

Ответы [ 3 ]

1 голос
/ 25 апреля 2010

Я предполагаю, что в вашем запросе, отправленном с помощью HttpWebRequest, отсутствует фактическое содержимоекоторая должна быть информацией о вашем методе rpc в формате xml.Пожалуйста, проверьте, подойдет ли вам приведенный ниже код;он должен отправить запрос на http://localhost:8080/xmlrpc/ и вывести полученный xml в консоль.

// send request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8080/xmlrpc/");
request.Method = "POST";
request.ContentType = "text/xml; encoding=utf-8";

string content = "<?xml version='1.0'?><methodCall><methodName>app.getName</methodName><params></params></methodCall>"; 
byte[] contentBytes = System.Text.UTF8Encoding.UTF8.GetBytes(content);                      
request.ContentLength = contentBytes.Length;
using (Stream stream = request.GetRequestStream())
{
    stream.Write(contentBytes, 0, contentBytes.Length); 
}

// get response
WebResponse response = request.GetResponse();
XmlDocument xmlDoc = new XmlDocument();
using (Stream responseStream = response.GetResponseStream())
{
    xmlDoc.Load(responseStream);
    Console.WriteLine(xmlDoc.OuterXml);
}       

надеюсь, это поможет, с уважением

1 голос
/ 26 апреля 2010

В дополнение к превосходному ответу, опубликованному здесь , можно также использовать xml-rpc.net для выполнения этой работы.

Вот код на сервересторона, предполагая, что getName теперь принимает параметр string:

def getName(self,meta, keyInput):                                                    
    return keyInput

И это будет код клиента C #, используя xml-rpc.net:

[XmlRpcUrl("http://localhost:8080/xmlrpc")]
public interface IMath : IXmlRpcProxy
{
    [XmlRpcMethod("app.getName")]
    string GetName(string number);

}

public string GetName(string keyInput)
{
        var  mathProxy = XmlRpcProxyGen.Create<IMath>();
        mathProxy.Url = "http://localhost:8080/xmlrpc/";
        return mathProxy.GetName(keyInput);

}

Надеюсь, это поможет всем, кто пытается сделать rpc-вызов в GAE из клиента C #.

0 голосов
/ 23 апреля 2010

Регулярное выражение в вашем приложении App Engine для конечной точки в точности равно «/ xmlrpc /», которое вы используете в тесте Python, но в вашем клиенте C # вы используете «/ xmlrpc / app», которое не ни к чему не привязан.

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