我一直在尝试为包含其他对象POST
的REST
服务 a提供. 我一直在为其他服务执行此操作,但奇怪的是它们都没有包含of ,因此对于其他情况,创建所需的 s 非常简单,但是对于这个新服务,我认为这只是添加of 的问题但显然不是。这就是我创建原始对象以准备发送它的方式:JSON object
NSArray
NSDictionaries
NSArray
NSDictionaries
JSON
NSArray
NSDictionaries
myDict = [NSDictionary dictionaryWithObjectsAndKeys:@"NFS", @"ticket[serie]",@"123",@"ticket[someID]",[NSArray arrayWithObject:[NSDictionary dictionaryWithObjectsAndKeys:@"99SKU1", @"product_id",@"1",@"quantity",nil]],@"lineItems",nil];
然后,我将该字典转换为 NSData 对象,以准备将其发送过来URLConnection
:
if ([NSJSONSerialization isValidJSONObject:myDict])
{
myData = [NSJSONSerialization dataWithJSONObject:myDict options:0 error:&theErrorIfAny];
// Send to webservice (myData)
}
我无权访问 Ruby 代码,但我可以访问服务器吐出到文件的日志文件,这就是我得到的:
{"ticket[serie]"=>"NFS"
"ticket[someID]"=>"123"
"lineItems"=>[{"product_id"=>"99SKU1","quantity"=>"1"}]
"ticket"=>{}}
除了那条额外的行之外,一切似乎都很好:"ticket"=>{}
就像我用一个额外的空字典填充请求一样。我已经通过删除 myDict 中除一项以外的所有项目,甚至删除其中的嵌套NSArray
withNSDictionaries
来尝试此请求,并且我仍然"ticket"=>{}
在请求末尾看到该行。
顺便说一句,网络服务是在 Ruby 中完成的,我无法直接访问它。我可以对这样做的人发表评论,但他们只是耸耸肩并争辩说,如果我使用 curl -d 从终端进行相同的调用...我将从服务器获得正确的响应。所以也许是JSONSerialization
对象或我创建呼叫的方式?:
+ (NSURLConnection *)postRequest:(NSData *)dataRequest toServerURL:(NSString *)serverURL onPort:(int)port withTimeOut:(NSTimeInterval)timeOut charSet:(char *)charset withDelegate:(id<NSURLConnectionDelegate>)myDelegate toServiceNamed:(NSString *)serviceName {
NSString *postDataLength = [NSString stringWithFormat:@"%d", [dataRequest length]];
DebugLog(@"bytes to send:%@", postDataLength);
NSMutableURLRequest *postRequest;
if (port == 0)
{
postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", serverURL, serviceName]] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:timeOut];
}
else
{
postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@:%d/%@", serverURL, port, serviceName]] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:timeOut];
}
[postRequest setHTTPMethod:@"POST"];
[postRequest setValue:postDataLength forHTTPHeaderField:@"Content-Length"];
if (charset == nil || strcmp(charset, ""))
{
charset = "utf-8";
}
[postRequest setValue:[NSString stringWithFormat:@"application/json; charset=%s", charset] forHTTPHeaderField:@"Content-Type"];
[postRequest setHTTPBody:dataRequest];
return [[NSURLConnection alloc] initWithRequest:postRequest delegate:myDelegate];
}
任何评论或指向一些经过验证的知识源都会很棒。