NSMutableURLRequest 不改变 HTTPMethod
NSMutableURLRequest not changing HTTPMethod
我在XCode中有以下方法:
- (void)makeRequest:(NSString *)wPin withMethod:(NSString *)HTTPMethod passValue:(NSString *)wVal {
@try {
NSString *params = @"";
NSString *postString;
NSData *postData;
NSString *method;
if ([HTTPMethod isEqualToString:@"GET"]) {
params = [NSString stringWithFormat:@"?pin=%@", wPin];
method = @"Retrieving data from";
} else {
postString = [NSString stringWithFormat:@"pin=%@&val=%@", wPin, wVal];
postData = [postString dataUsingEncoding:NSUTF8StringEncoding];
method = [NSString stringWithFormat:@"Passing '%@' to", postString];
}
NSString *requestURL = [NSString stringWithFormat:@"%@%@", homeURL, params];
NSLog(@"%@ '%@'", method, requestURL);
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:requestURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:0];
NSString *postLength = [[NSString alloc] initWithFormat:@"%lu", (unsigned long)[postData length]];
[request setHTTPMethod:HTTPMethod];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSString *postBody = [[NSString alloc] initWithBytes: [request.HTTPBody bytes] length: [request.HTTPBody length] encoding:NSUTF8StringEncoding];
NSLog(@"%@", postBody);
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate: self];
if (conn) { //Makes connection
}
}
@catch (NSException *e) {
NSLog(@"Exception %@", e);
}
}
当我调用此方法时使用:
[self makeRequest:wPin withMethod:@"GET" passValue:@""];
我的服务器记录了一个健康的 GET 请求,并向我发回了正确的数据,我对其进行了解析...它有效,没问题。
但是,当我调用此方法时使用:
[self makeRequest:wPin withMethod:@"POST" passValue:wState];
我的服务器仍然将请求方法记录为 "GET"。我什至尝试直接设置 HTTPMethod:
[request setHTTPMethod:@"POST"];
我的服务器仍然记录一个 "GET" 请求。
仅供参考:我在 JavaScript 中开发了相同的应用程序,一切正常(服务器正确处理 GET 和 POST)。
这是我的应用控制台输出:
(加载中)
2015-01-28 10:25:08.324 Switch[2977:132599] Retrieving data from '<my server>?pin=18'
2015-01-28 10:25:08.330 Switch[2977:132599] Retrieving data from '<my server>?pin=23'
2015-01-28 10:25:08.611 Switch[2977:132599] 18OFF
2015-01-28 10:25:08.626 Switch[2977:132599] 23ON
(当我发送三个 POST 请求时)
2015-01-28 10:25:28.842 Switch[2977:132599] Passing 'pin=18&val=1' to '<my server>'
2015-01-28 10:25:28.843 Switch[2977:132599] pin=18&val=1
2015-01-28 10:28:12.189 Switch[2977:132599] Passing 'pin=18&val=0' to '<my server>'
2015-01-28 10:28:12.190 Switch[2977:132599] pin=18&val=0
2015-01-28 10:28:13.702 Switch[2977:132599] Passing 'pin=23&val=0' to '<my server>'
2015-01-28 10:28:13.703 Switch[2977:132599] pin=23&val=0
此外,当您在输出中看到类似 "pin=18&val=1" 的内容时,请注意,这只是 postBody 发送前的一个 NSLog。这不是服务器响应,与您在输出中看到的“18OFF”不同。
尝试更改编码方案,
[postString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
问题出在 DNS 与我的服务器一起工作的方式上。我必须绕过端口 80,所以当我的域名指向它到达路由器的正确端口时,我会收到来自 POST 请求的 "Object Moved" 响应,除非我手动输入服务器的 IP。这不知何故意味着 POST 请求在到达我的页面之前变成了 GET 请求。在使用直接 IP 时,该应用程序可以正常工作。我得在别处解决这个问题。感谢所有尝试提供帮助的人!
(好消息是,NSMutableURLRequest 有效!)
我在XCode中有以下方法:
- (void)makeRequest:(NSString *)wPin withMethod:(NSString *)HTTPMethod passValue:(NSString *)wVal {
@try {
NSString *params = @"";
NSString *postString;
NSData *postData;
NSString *method;
if ([HTTPMethod isEqualToString:@"GET"]) {
params = [NSString stringWithFormat:@"?pin=%@", wPin];
method = @"Retrieving data from";
} else {
postString = [NSString stringWithFormat:@"pin=%@&val=%@", wPin, wVal];
postData = [postString dataUsingEncoding:NSUTF8StringEncoding];
method = [NSString stringWithFormat:@"Passing '%@' to", postString];
}
NSString *requestURL = [NSString stringWithFormat:@"%@%@", homeURL, params];
NSLog(@"%@ '%@'", method, requestURL);
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:requestURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:0];
NSString *postLength = [[NSString alloc] initWithFormat:@"%lu", (unsigned long)[postData length]];
[request setHTTPMethod:HTTPMethod];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSString *postBody = [[NSString alloc] initWithBytes: [request.HTTPBody bytes] length: [request.HTTPBody length] encoding:NSUTF8StringEncoding];
NSLog(@"%@", postBody);
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate: self];
if (conn) { //Makes connection
}
}
@catch (NSException *e) {
NSLog(@"Exception %@", e);
}
}
当我调用此方法时使用:
[self makeRequest:wPin withMethod:@"GET" passValue:@""];
我的服务器记录了一个健康的 GET 请求,并向我发回了正确的数据,我对其进行了解析...它有效,没问题。
但是,当我调用此方法时使用:
[self makeRequest:wPin withMethod:@"POST" passValue:wState];
我的服务器仍然将请求方法记录为 "GET"。我什至尝试直接设置 HTTPMethod:
[request setHTTPMethod:@"POST"];
我的服务器仍然记录一个 "GET" 请求。
仅供参考:我在 JavaScript 中开发了相同的应用程序,一切正常(服务器正确处理 GET 和 POST)。
这是我的应用控制台输出:
(加载中)
2015-01-28 10:25:08.324 Switch[2977:132599] Retrieving data from '<my server>?pin=18'
2015-01-28 10:25:08.330 Switch[2977:132599] Retrieving data from '<my server>?pin=23'
2015-01-28 10:25:08.611 Switch[2977:132599] 18OFF
2015-01-28 10:25:08.626 Switch[2977:132599] 23ON
(当我发送三个 POST 请求时)
2015-01-28 10:25:28.842 Switch[2977:132599] Passing 'pin=18&val=1' to '<my server>'
2015-01-28 10:25:28.843 Switch[2977:132599] pin=18&val=1
2015-01-28 10:28:12.189 Switch[2977:132599] Passing 'pin=18&val=0' to '<my server>'
2015-01-28 10:28:12.190 Switch[2977:132599] pin=18&val=0
2015-01-28 10:28:13.702 Switch[2977:132599] Passing 'pin=23&val=0' to '<my server>'
2015-01-28 10:28:13.703 Switch[2977:132599] pin=23&val=0
此外,当您在输出中看到类似 "pin=18&val=1" 的内容时,请注意,这只是 postBody 发送前的一个 NSLog。这不是服务器响应,与您在输出中看到的“18OFF”不同。
尝试更改编码方案,
[postString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
问题出在 DNS 与我的服务器一起工作的方式上。我必须绕过端口 80,所以当我的域名指向它到达路由器的正确端口时,我会收到来自 POST 请求的 "Object Moved" 响应,除非我手动输入服务器的 IP。这不知何故意味着 POST 请求在到达我的页面之前变成了 GET 请求。在使用直接 IP 时,该应用程序可以正常工作。我得在别处解决这个问题。感谢所有尝试提供帮助的人!
(好消息是,NSMutableURLRequest 有效!)