如何从 iOS 应用程序调用在 Python 的 ladon 框架中开发的 Web 服务?

Posted

技术标签:

【中文标题】如何从 iOS 应用程序调用在 Python 的 ladon 框架中开发的 Web 服务?【英文标题】:How to call web service which is developed in Python's ladon framework from iOS app? 【发布时间】:2013-08-31 09:38:16 【问题描述】:

网络服务建立在 Python 的 Ladon 框架之上。

Web 服务 URL 为:http://ladonize.org/python-demos/Calculator

调用web服务的代码如下:

  NSString *requestString = [NSString stringWithFormat:
                               @"http://ladonize.org/python-demos/Calculator"];
    NSString *jsonString = [NSString stringWithFormat:@"\"methodname\":\"add\",\"args\": \"a\":\"123\",\"b\":\"123\""];
    NSData *jsonData = [NSData dataWithBytes: [jsonString UTF8String] length: [jsonString length]];
    NSURL *url = [NSURL URLWithString:requestString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody: jsonData];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];

    NSError *errorReturned = nil;
    NSURLResponse *theResponse =[[NSURLResponse alloc]init];
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&theResponse error:&errorReturned];

    if (errorReturned) 
        NSLog(@"Error %@",errorReturned.description);
    
    else
    
        NSError *jsonParsingError = nil;
        NSMutableArray *arrDoctorInfo  = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError];
        NSString* newStr = [NSString stringWithUTF8String:[data bytes]];
        NSLog(@"Dict %@",newStr);
    

我得到以下回应

<html>
    <head>
        <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
        <title>Calculator</title>
        <style>

    body  margin: 0px; padding: 0px; font-family: verdana; font-size: 12pt; background-color: #FCFCFC; 

    div.service-header 
        height: 34px;
        font-weight: bold; padding: 10px; font-size: 30px; color: white; border-bottom: 1px solid black; background: #70803C;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#A0B06C', endColorstr='#70803C'); background: -webkit-gradient(linear, left top, left bottom, from(#A0B06C), to(#70803C)); background: -moz-linear-gradient(top,  #A0B06C,  #70803C);
        text-shadow: #555555 2px 3px 3px;
    
    div.service-header div.service-title position: relative; float:left
    div.service-header .skin-selector padding-top: 8px; margin-bottom: 0; position:relative; float: right; font-size: 12pt;

    div.service-overview 
        float: right; margin: 20px; width: 200px;
        -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border-radius: 7px 7px 7px 7px; background-color: #F6F6F6; border: 1px solid #E6E6E6; border-collapse: separate; font-size: 11px; padding: 10px; margin-right: 20px;
        -moz-box-shadow: 2px 2px 4px #555; -webkit-box-shadow: 2px 2px 4px #555; box-shadow: 2px 2px 4px #555;
    

    div.service-overview div.headline  font-weight: bold; font-size: 18px; 
    div.service-overview div.title  font-weight: bold; margin: 4px; font-size: 1.2em; 
    div.service-overview ul.list  padding: 0px; margin: 0px; margin-left: 15px; list-style-type: none; 
    div.service-overview ul.list li  font-size: 1.1em; 

    div.service-description  padding: 15px; padding-bottom: 0px; 
    div.service-description div.title  font-weight: bold; font-size: 1.2em; 
    div.service-description p.doc-lines  font-size: 0.8em; 
    div.service-description p.url  font-size: 0.8em; font-style: italic; 
    div.service-description p.url span.url-title  font-weight: bold; 

    div.service-interfaces  padding: 15px; padding-bottom: 0px;  
    div.service-interfaces div.title  font-weight: bold; font-size: 1.2em; 
    div.service-interfaces ul.list  font-size: 0.8em; 
    div.service-interfaces ul.list li  padding: 4px; 

    div.service-api  padding: 15px; padding-bottom: 0px;  
    div.service-api div.methods div.title  font-weight: bold; font-size: 1.2em;  
    div.service-api div.methods ul.list  font-size: 0.9em; list-style-type: none;  
    div.service-api div.methods ul.list li.entry 
        -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border-radius: 7px 7px 7px 7px; background-color: #F6F6F6; border: 1px solid #E6E6E6; 
        border-collapse: separate; font-size: 0.8em; padding: 10px; margin-right: 20px;
        -moz-box-shadow: 2px 2px 5px #555; -webkit-box-shadow: 2px 2px 5px #555; box-shadow: 2px 2px 5px #555;
        margin-bottom: 16px;
     
    div.service-api div.methods ul.list li.entry div.declaration 
        font-size: 1.5em;
     
    div.service-api div.methods ul.list li.entry div.declaration span.name  color: #881a1a;  
    div.service-api div.methods ul.list li.entry span.param-type  color: #68387f;  
    div.service-api div.methods ul.list li.entry span.param-name  
    div.service-api div.methods ul.list li.entry p.doc-lines  font-size: 1.2em; color: #276d11;  
    div.service-api div.methods ul.list li.entry ul.params p.doc-lines  margin-top:0;margin-bottom:6px; font-size: 1.0em; color: #276d11;  

    div.service-api div.types div.title  font-weight: bold; font-size: 1.2em;  
    div.service-api div.types ul.list  font-size: 0.9em; list-style-type: none;  
    div.service-api div.types ul.list li.entry 
        -moz-border-radius: 7px 7px 7px 7px; -webkit-border-radius: 7px 7px 7px 7px; border-radius: 7px 7px 7px 7px; background-color: #F6F6F6; border: 1px solid #E6E6E6; 
        border-collapse: separate; font-size: 0.8em; padding: 10px; margin-right: 20px;
        -moz-box-shadow: 2px 2px 5px #555; -webkit-box-shadow: 2px 2px 5px #555; box-shadow: 2px 2px 5px #555;
        margin-bottom: 16px;
     
    div.service-api div.types ul.list li.entry div.definition 
        font-size: 1.5em;
     
    div.service-api div.types ul.list li.entry div.definition span.name  color: #881a1a;  
    div.service-api div.types ul.list li.entry span.param-type  color: #68387f;  
    div.service-api div.types ul.list li.entry span.param-name  
    div.service-api div.types ul.list li.entry p.doc-lines  margin-top:0;margin-bottom:6px; font-size: 1.0em; color: #276d11;  

    div.service-footer  font-size: 0.8em; text-align: center; font-style: italic; padding-top: 10px; padding-bottom: 10px; 

    a:link  color: #00732F; text-decoration: none 
    a:visited  color: #00732F; text-decoration: none 
    a:hover  color: #00732F; text-decoration: underline 

        </style>
    </head>
    <body>
        <div class="service-header">
            <div class="service-title">Calculator</div>
            <form method="get" class="skin-selector">
                <label for="skin-select">skins:</label>
                <select id="skin-select" name="skin" onchange="document.forms[0].submit()">
                    <option value="">Default</option>

                    <option value="simple">Simple</option>

                    <option value="bluebox">Bluebox</option>

                </select>
            </form>
        </div>
        <div class="service-overview">
            <div class="headline">Overview</div>
            <div class="title">Methods</div>
            <ul class="list">

                <li>
                    <a href="#add"><span class="entry">add</span></a>
                    ( )
                </li>

            </ul>
            <div class="title">Types</div>
            <ul class="list">

            </ul>
        </div>

        <div class="service-description">
            <div class="title">Description</div>
            <p class="doc-lines">
                This service does the math, and serves as example for new potential Ladon users.
            </p>
        </div>
        <div class="service-interfaces">
            <div class="title">Interfaces</div>
            <ul class="list">

                <li>soap11 [ <a href="http://ladonize.org/python-demos/Calculator/soap11">url</a> <a href="http://ladonize.org/python-demos/Calculator/soap11/description">description</a> ]</li>

                <li>jsonwsp [ <a href="http://ladonize.org/python-demos/Calculator/jsonwsp">url</a> <a href="http://ladonize.org/python-demos/Calculator/jsonwsp/description">description</a> ]</li>

                <li>soap [ <a href="http://ladonize.org/python-demos/Calculator/soap">url</a> <a href="http://ladonize.org/python-demos/Calculator/soap/description">description</a> ]</li>

            </ul>
        </div>
        <div class="service-api">
            <div class="methods">
                <div class="title">Methods</div>
                <ul class="list">

                    <li class="entry">
                        <div class="declaration">
                            <a name="add"></a><span class="name">add</span>
                            (



                            <span class="param-type">

                                number

                            </span> 
                            <span class="param-name">a</span>


                            , 
                            <span class="param-type">

                                number

                            </span> 
                            <span class="param-name">b</span>


                            )
                        </div>
                        <p class="doc-lines">
                            Add two integers together and return the result

                        </p>


                        <div class="params-title">Parameters</div>
                        <ul class="params">

                            <li>
                                <span class="param-name">a</span>: <span class="param-type">

                                    number

                                </span>

                                <br/>
                                <p class="doc-lines">
                                    1st integer
                                </p>
                            </li> 



                            <li>
                                <span class="param-name">b</span>: <span class="param-type">

                                    number

                                </span>

                                <br/>
                                <p class="doc-lines">
                                    2nd integer
                                </p>
                            </li> 

                        </ul>


                        <div class="return-type-title">Return value</div>
                        <div class="return-type">
                            <span class="param-type">

                                number

                            </span>
                            <p class="doc-lines">
                                The result of the addition
                            </p>
                        </div>
                    </li>

                </ul>
            </div>
            <div class="types">
                <div class="title">Types</div>
                <ul class="list">

                </ul>
            </div>
        </div>
        <div class="service-footer">Powered by Ladon for Python</div>
    </body>
</html>

【问题讨论】:

@Wain 这么多信息是 inof ?? 是的,更好。表明您已经尝试过并更好地描述了问题。 看看用dataUsingEncoding:创建你的jsonData 【参考方案1】:

您使用的 URL 路径似乎有误,应更改为 http://ladonize.org/python-demos/Calculator/jsonwsp

创建jsonData 的更好方法是使用dataUsingEncoding:

您不应该创建响应:

NSURLResponse *theResponse =[[NSURLResponse alloc]init];

因为它将作为sendSynchronousRequest 的一部分创建并返回给您。您应该做的是检查theResponse 的内容以验证HTTP 状态代码。

【讨论】:

【参考方案2】:

这是可行的解决方案...

NSString *requestString = [NSString stringWithFormat:
                               @"http://ladonize.org/python-demos/Calculator/jsonwsp"];
    NSString *jsonString = [NSString stringWithFormat:@"\"methodname\":\"add\",\"args\": \"a\":123,\"b\":123"];
    //: "methodname": "add", "args": "a":"123","b":"123"
    NSLog(@"the request string is %@", requestString);
    NSData *jsonData = [NSData dataWithBytes: [jsonString UTF8String] length: [jsonString length]];


NSURL *url = [NSURL URLWithString:requestString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody: jsonData];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];

NSError *errorReturned = nil;
NSURLResponse *theResponse =[[NSURLResponse alloc]init];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&theResponse error:&errorReturned];

if (errorReturned) 
    NSLog(@"Error %@",errorReturned.description);

else

    NSError *jsonParsingError = nil;
    NSMutableArray *arrDoctorInfo  = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError];
    NSString* newStr = [NSString stringWithUTF8String:[data bytes]];
    NSLog(@"Dict %@",newStr);

【讨论】:

以上是关于如何从 iOS 应用程序调用在 Python 的 ladon 框架中开发的 Web 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用swift从ios应用程序调用苹果钱包

如何监控从 iOS 模拟器发出的网络调用

如何从同步代码 Python 中调用异步函数

如何从 Xamarin.iOS 中的 iOS 扩展调用 NSUserDefaults Observer

如何从 iOS 推送插件调用 JavaScript 函数?

如何从 html / javascript 调用 MainViewController.h 方法? (IOS 电话间隙)