使用Apache CXF的ASIHttprequest Restful webservices

时间:2011-12-22 18:16:58

标签: objective-c cocoa apache cxf asihttprequest

我正在开发一个涉及服务器端Apache CXF的项目,提供RESTful Web服务,以JSON格式接收和转出。客户端是带有ASIHTTPRequest和SBJson的Mac OSX应用程序。我在过去几天遇到了各种问题,但未能找到解决方案。

在服务器端:

@Override
@POST
@Path("/testService/")
@Consumes(MediaType.APPLICATION_JSON)
public Boolean service1(SomeMetaData metaData)
{
  return this.testMetaData(metaData);
}

在客户端:

NSString *requestURLString = [NSString stringWithFormat:@"%@%@", serverURL, @"/webServices/rest/testService"];
NSURL *url = [NSURL URLWithString:requestURLString];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setValidatesSecureCertificate:NO];
[request setRequestMethod:@"POST"];
[request addRequestHeader:@"Content-Type" value:@"application/json"];
NSString* jsonMetaData = [[SomeMetaData proxyForJson] JSONRepresentation];

NSMutableData *requestBody = [[NSMutableData alloc] initWithData:[jsonMetaData dataUsingEncoding:NSUTF8StringEncoding]];

[request setPostBody:requestBody];
[request startAsynchronous];

[request setCompletionBlock:^{
    NSLog(@"Response: %@", [request responseString]);
}];
[request setFailedBlock:^{
    NSLog(@"Failed: %@", [request error]);
}];

从元数据对象生成的JSON字符串是这样的:

{
  "metaData": 
  {
    "name":"test.txt",
    "remoteKey":"4",
    "remoteShare":"test1"
  }
}

客户端和服务器位于不同的物理计算机中,但位于同一LAN中。

第一期:

控制台中随机出现错误域错误。它的外观没有明显的模式,但它保证会出现我的第一次尝试。

Failed: Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0x10013a030 {NSLocalizedDescription=A connection failure occurred, NSUnderlyingError=0x100190cf0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1005.)"}

第二期:

这似乎是一个json解析器错误,我真的不明白为什么。服务器端和客户端的容器具有相同的结构。

Response for getExistsFileRequest: JAXBException occurred : unexpected element (uri:"", local:"metaData"). Expected elements are <{}someMetaData>. unexpected element (uri:"", local:"metaData"). Expected elements are <{}someMetaData>.

这种问题似乎只有在我的请求中有参数时才会发生。我没有输入参数的其他GET Web服务工作得很好。

我被困在这几天了。任何建议都将非常感谢!

如果有人想知道,在服务器端为所有Web服务定义了根路径,因此在这种情况下不太可能出现问题。

* 另一个编辑:* 服务器端的请求/响应标头

[ERROR] 500 - POST /webServices/rest/testService (192.168.1.29) 199 bytes
Request headers
  Host: 192.168.1.206
  User-Agent: ASIHTTPRequest (Macintosh; Mac OS X 10.7.2; en_CA)
  Content-Length: 240
  Content-Type: application/json
  Accept-Encoding: gzip
  Authorization: Basic cmthbmc6Um9LYTEyMyE=
  Connection: close
Response headers
  Connection: close
  Content-Type: text/plain
  Date: Thu, 22 Dec 2011 18:55:23 GMT
  Expires: Thu, 01 Jan 1970 00:00:00 GMT
  Set-Cookie: JSESSIONID=1uxr8b377s5xs;Path=/

2 个答案:

答案 0 :(得分:1)

JAXBException位于此xml命名空间中( javax.xml.bind.JAXBException )。

您是否尝试将JSON解析为XML?

答案 1 :(得分:0)

那不是JSON

{
  metaData =     {
    name = "test.txt";
    remoteKey = 4;
    remoteShare = test1;
};
}

你的意思是:

{
  "metaData": {
    "name":"test.txt",
    "remoteKey":"4",
    "remoteShare":"test1"
  }
}

(如果您这样做,请更新您的问题,我将删除此答案;)