【问题标题】:Trying to make GET request in objC using NSURL尝试使用 NSURL 在 objC 中发出 GET 请求
【发布时间】:2014-03-26 05:33:02
【问题描述】:

我正在尝试在 iOS 应用 中提出此请求

我已经使用NSURLConnection 登录了网站,完成处理程序中有以下代码:

NSMutableURLRequest *requestGrades = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://mistar.oakland.k12.mi.us/novi/StudentPortal/Home/LoadProfileData/Assignments?_=1395809728907"]];
[requestGrades setHTTPMethod:@"GET"];
[NSURLConnection sendAsynchronousRequest:requestGrades queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *gradeResponse, NSData *gradeData, NSError *gradeError) {
    
    if ([gradeData length] > 0 && gradeError == nil) {
        NSLog(@"%@",requestGrades);
        NSLog(@"grade Response = %@ \ngrade Data = %@", gradeResponse, [[NSString alloc] initWithData:gradeData encoding:NSUTF8StringEncoding]);
    } else {
        NSLog(@"grade Error = %@", gradeError);
    }
}];

我在应用中得到的响应类似于:

grade Response = <NSHTTPURLResponse: 0x109627500> { URL: https://mistar.oakland.k12.mi.us/novi/StudentPortal/Home/LoadProfileData/Assignments?_=1395809728907 } { status code: 200, headers {
    "Cache-Control" = "public, max-age=0";
    Connection = "Keep-Alive";
    "Content-Length" = 234;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Wed, 26 Mar 2014 05:21:52 GMT";
    Expires = "Wed, 26 Mar 2014 05:21:52 GMT";
    "Last-Modified" = "Wed, 26 Mar 2014 05:21:52 GMT";
    Server = "Microsoft-IIS/7.5";
    Vary = "*";
    "X-AspNetMvc-Version" = "4.0";
    "X-Powered-By" = "ASP.NET";
} } 

如您所见,这与 Chrome 的响应不同(最值得注意的是,Content-Length - 我只有 234 的长度 - 我希望得到类似 31189 的内容)。

在 chrome 开发者工具的 Network 部分进行挖掘,查看当我尝试请求数据时 chrome 的作用是:

Chrome,当我单击按钮获取一些数据时,会发出 2 个GET 请求(两张图片)。第一个获取我要为我的应用获取的数据,而第二个似乎并没有真正做任何事情。但是第二个 chrome 请求得到的响应与我尝试从 iOS 发出第一个 chrome 请求时得到的响应相同(第一张图片应该返回 31189 的 Content-Length)。

所以我不确定我的NSURLConnection 做错了什么。

【问题讨论】:

  • Response= { URL: mistar.oakland.k12.mi.us/novi/StudentPortal/Home/… } { 状态码: 200, headers { "Cache-Control" = "public, max-age=0";连接=“保持活动”; “内容长度”= 234; “内容类型”=“文本/html;字符集=utf-8”;日期 =“格林威治标准时间 2014 年 3 月 26 日星期三 06:11:35”; Expires = "2014 年 3 月 26 日星期三 06:11:35 GMT"; "Last-Modified" = "2014 年 3 月 26 日星期三 06:11:35 GMT";服务器 = "微软-IIS/7.5";变化 = "*"; "X-AspNetMvc-版本" = "4.0"; "X-Powered-By" = "ASP.NET"; } }
  • 我刚刚再次查看了两个请求 URL,我想我遗漏了一些东西。它们看起来都像 GEThttps://mistar.oakland.k12.mi.us/novi/StudentPortal/Home/LoadProfileData/Assignments?_=1395809728907 的请求。
  • 对不起。
    学生资料
  • 这与图片中第二个 chrome 响应的数据完全相同。这很奇怪,因为我的请求中没有True;
  • 不,我必须在那之前登录。我只是尝试了几次请求,发现号码 1395809728907 每次都不一样。我不确定它是从哪里来的。我在页面的 HTML 中找不到它

标签: javascript ios objective-c google-chrome nsurlconnection


【解决方案1】:

做一点测试,我已经确认你必须做以下四个NSURLConnectionNSURLSession 请求:

  • 登录/novi/StudentPortal/Home/Login

  • 转到/novi/StudentPortal/Home/PortalMainPage的门户页面

  • 设置学生横幅/novi/StudentPortal/StudentBanner/SetStudentBanner/XXX,其中XXX 是与门户页面中特定学生关联的行的id

  • novi/StudentPortal/Home/LoadProfileData/Assignments 请求分配(不需要?_=xxxx 参数;看起来AjaxLoad Javascript 使用它来跟踪请求,但我们不必在这里担心)

我注意到,如果您跳过中间两个步骤中的任何一个,分配请求将失败,如您的问题所示。 (坦率地说,这让我质疑您正在与之交互的系统中的一些设计选择,但我假设您对此没有发言权。)但是如果您完成所有四个,您将获得与作业相关联的 HTML。

顺便说一句,在解析此 HTML 时,您可能倾向于使用 NSXMLParser 或正则表达式,但我建议您考虑使用 Hpple(请参阅 Ray Wenderlich 的 article on parsing HTML)。

【讨论】:

  • 对,所以我可以毫无问题地进入第 3 步,我有三个嵌套的 NSURLConnections。最后一步我无法获得?=xxxx。有了这个,我应该能够下载相关数据
  • 关于如何从AjaxLoad获取最后一个号码的任何想法?
  • @AndrewSB 您不需要 ?=xxx 作为分配 URL。对于SetStudentBanner(只是在末尾添加/xxx),您必须从PortalMainPage 解析HTML。
  • 我该怎么做?如果它有帮助,这是我的代码:github.com/AndrewSB/MistarApp/blob/master/MistarApp/MistarApp/… 该链接指向具有编号的请求的行
  • 哦,对了。从SetStudentBanner 获取userID。我已经从该页面获得了HTML,对其进行了解析并获得了userID。我被困在之后
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2021-01-06
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多