我的服务器代码如下:
// golang
type SomeHandler struct{}
func (*SomeHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Println("method:", req.Method)
fmt.Println("content length:", req.ContentLength)
// read request body as []byte
content, err := ioutil.ReadAll(req.Body)
if err != nil {
// do sth.
return
}
// decode JSON
// ...
}
客户端:
// Objective-C on iOS 6/7
// NSURL *myUrl = ...
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:myUrl];
[req setHTTPMethod:@"POST"];
[req setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
id obj = @{
@"username" : @"myname",
@"password" : @"mypwd",
};
NSError *error;
NSData *inputJson = [NSJSONSerialization dataWithJSONObject:obj options:0 error:&error];
if (error) {
// no error here
}
[req setHTTPBody:inputJson];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (error) {
NSLog(@"ERROR: %@", error.localizedDescription);
return;
}
NSHTTPURLResponse *resp = (NSHTTPURLResponse *)response;
NSString *outputText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"response (%d):\n%@", (int)resp.statusCode, outputText);
}
当我在iPhone模拟器上运行这段iOS代码时,服务器端显示:
method: GET
content length: 0
请修改客户端代码:[req setHTTPMethod:@"HEAD"];
,服务器将正常工作:
method: HEAD
content length: <some length>
我不知道客户端的POST代码有什么问题,或者服务器应该怎么做才能检索到客户端发送的[]byte数据。请注意,我的Go版本是:
$ go version
go version go1.2.1 darwin/amd64
curl
向服务器发出POST请求,或让你的客户端尝试向一个监听netcat套接字进行POST操作) - James Henstridge