通过键值对读取jSON对象请求
我正在尝试阅读jSON
对的forms的jSON
响应。
当我通过浏览器手动点击URL时,通过jSON
对象获得所需的状态码/响应
{"status":"0","responseCode":"1021","response":{"message":"Please check your Settings ","data":"2012-11-24, 7:28 am"}}
当我试图通过我的app.My代码,当我通过应用程序发送数据时得到相同的预期响应
[dictionnary setObject:@"admin" forKey:@"username"]; [dictionnary setObject:@"123123" forKey:@"password"]; NSError *error = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionnary options:kNilOptions error:&error]; NSString *urlString = @"MY CALL URL"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:jsonData]; NSURLResponse *response = NULL; NSError *requestError = NULL; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError]; NSLog(@"response is obtained"); NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] ; NSLog(@"%@", responseString);
响应我正在通过代码获取
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>PHP notice</title> <style type="text/css"> /*<![CDATA[*/ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;margin:0;padding:0;} body{line-height:1;} ol,ul{list-style:none;} blockquote,q{quotes:none;} blockquote:before,blockquote:after,q:before,q:after{content:none;} :focus{outline:0;} ins{text-decoration:none;} del{text-decoration:line-through;} table{border-collapse:collapse;border-spacing:0;} body { font: normal 9pt "Verdana"; color: #000; background: #fff; } h1 { font: normal 18pt "Verdana"; color: #f00; margin-bottom: .5em; } h2 { font: normal 14pt "Verdana"; color: #800000; margin-bottom: .5em; } h3 { font: bold 11pt "Verdana"; } pre { font: normal 11pt Menlo, Consolas, "Lucida Console", Monospace; } pre span.error { display: block; background: #fce3e3; } pre span.ln { color: #999; padding-right: 0.5em; border-right: 1px solid #ccc; } pre span.error-ln { font-weight: bold; } .container { margin: 1em 4em; } .version { color: gray; font-size: 8pt; border-top: 1px solid #aaa; padding-top: 1em; margin-bottom: 1em; } .message { color: #000; padding: 1em; font-size: 11pt; background: #f3f3f3; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; margin-bottom: 1em; line-height: 160%; } .source { margin-bottom: 1em; } .code pre { background-color: #ffe; margin: 0.5em 0; padding: 0.5em; line-height: 125%; border: 1px solid #eee; } .source .file { margin-bottom: 1em; font-weight: bold; } .traces { margin: 2em 0; } .trace { margin: 0.5em 0; padding: 0.5em; } .trace.app { border: 1px dashed #c00; } .trace .number { text-align: right; width: 2em; padding: 0.5em; } .trace .content { padding: 0.5em; } .trace .plus, .trace .minus { display:inline; vertical-align:middle; text-align:center; border:1px solid #000; color:#000; font-size:10px; line-height:10px; margin:0; padding:0 1px; width:10px; height:10px; } .trace.collapsed .minus, .trace.expanded .plus, .trace.collapsed pre { display: none; } .trace-file { cursor: pointer; padding: 0.2em; } .trace-file:hover { background: #f0ffff; } /*]]>*/ </style> </head> <body> <div class="container"> <h1>PHP notice</h1> <p class="message"> Undefined index: signature </p> <div class="source"> <p class="file">/var/www/protected/controllers/Authenticate.php(955)</p> <div class="code"><pre><span class="ln">943</span> <td class="number"> #7 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/yii-1.1.10.r3566/framework/base/CApplication.php(162): <strong>CWebApplication</strong>-><strong>processRequest</strong>() </div> <div class="code"><pre><span class="ln">157</span> */ <span class="ln">158</span> public function run() <span class="ln">159</span> { <span class="ln">160</span> if($this->hasEventHandler('onBeginRequest')) <span class="ln">161</span> $this->onBeginRequest(new CEvent($this)); <span class="error"><span class="ln error-ln">162</span> $this->processRequest(); </span><span class="ln">163</span> if($this->hasEventHandler('onEndRequest')) <span class="ln">164</span> $this->onEndRequest(new CEvent($this)); <span class="ln">165</span> } <span class="ln">166</span> <span class="ln">167</span> /** </pre></div> </td> </tr> <tr class="trace app expanded"> <td class="number"> #8 </td> <td class="content"> <div class="trace-file"> <div class="plus">+</div> <div class="minus">–</div> /var/www/index.php(13): <strong>CApplication</strong>-><strong>run</strong>() </div> <div class="code"><pre><span class="ln">08</span> defined('YII_DEBUG') or define('YII_DEBUG',true); <span class="ln">09</span> // specify how many levels of call stack should be shown in each log message <span class="ln">10</span> defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3); <span class="ln">11</span> <span class="ln">12</span> require_once($yii); <span class="error"><span class="ln error-ln">13</span> Yii::createWebApplication($config)->run(); </span></pre></div> </td> </tr> </table> </div> <div class="version"> 2012-11-24 07:38:18 Apache/2.2.22 (Ubuntu) <a href="http://www.yiiframework.com/">Yii Framework</a>/1.1.10 </div> </div> <script type="text/javascript"> /*<![CDATA[*/ var traceReg = new RegExp("(^|\\s)trace-file(\\s|$)"); var collapsedReg = new RegExp("(^|\\s)collapsed(\\s|$)"); var e = document.getElementsByTagName("div"); for(var j=0,len=e.length;j<len;j++){ if(traceReg.test(e[j].className)){ e[j].onclick = function(){ var trace = this.parentNode.parentNode; if(collapsedReg.test(trace.className)) trace.className = trace.className.replace("collapsed", "expanded"); else trace.className = trace.className.replace("expanded", "collapsed"); } } } /*]]>*/ </script> </body> </html>
在你的URLRequest中指定你不想要html,但你想要原始的json
NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"];
至:
NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//!!!
你可以尝试下面的代码可能会帮助你。
NSString *username = emailField.text; NSString *password = passwordField.text; NSMutableDictionary *dictionnary = [NSMutableDictionary dictionary]; [dictionnary setObject:@"admin" forKey:@"username"]; [dictionnary setObject:@"123456" forKey:@"password"]; NSError *error = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionnary options:kNilOptions error:&error]; NSString *urlString = @"Sample URL"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:jsonData]; NSURLResponse *response = NULL; NSError *requestError = NULL; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] ; NSLog(@"%@", responseString);
如果它是一个GET请求,那么你可以尝试链接: /index.php/api/transaction/model/transactionsuccess?username=admin&password=1212 3
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"/index.php/api/transaction/model/transactionsuccess?username=admin&password=12123"]]; // Perform request and get JSON as a NSData object NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSLog(@"response=%@",response );
并使用此代码。
这个问题与服务器端有关; 所以你必须咨询服务的后端开发者,更可能的是,在服务端检查使用POST或GET的数据命中,而如果后端是php,所以暂时build议他使用$ request而不是$得到或$后,只是为了testing。 另外,这个事实很明显,正如你所提到的那样,当你从浏览器中尝试url时,你得到了所需的json,但是在POST的情况下,你永远无法做到这一点。
我100%肯定这是从服务器端。如果可能的话提供我所需的服务器url与testingauthenticationvariables。 (通过断点或日志,通过参数交叉检查完整的url。)