我正在开发一个涉及服务器端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=/
答案 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"
}
}
(如果您这样做,请更新您的问题,我将删除此答案;)