【问题标题】:ASIHttprequest with Apache CXF Restful webservicesASIHttprequest 与 Apache CXF Restful web 服务
【发布时间】:2011-12-22 18:16:57
【问题描述】:

我正在开展一个项目,该项目涉及服务器端的 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"
  }
}

客户端和服务器在不同的物理计算机上,但在同一个局域网内。

第一期:

控制台随机出现错误域错误。它的外观没有明显的规律,但我第一次尝试时肯定会出现。

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 服务定义了根路径,因此在这种情况下不太可能成为问题。

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

[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=/

【问题讨论】:

    标签: objective-c cocoa apache cxf asihttprequest


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您回来 :D 绝对是 JSON,正如我在服务器端的注释中指定的那样:@Consumes(MediaType.APPLICATION_JSON)。
    • 那么如何抛出 XML 异常 - 服务器上的堆栈跟踪是什么?
    【解决方案2】:

    这不是 JSON

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

    你的意思是:

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

    (如果你这样做了,请更新你的问题,我会删除这个答案;)

    【讨论】:

    • 是的,我只是使用解析器来清除结构。我会更新我的问题。谢谢。
    • 为什么不直接从服务器粘贴 actual 字符串,这样我们就可以看到解析器抛出错误的原因?
    • 我无法在服务器端拦截请求正文。我试过 Fiddler,但不知道为什么它不拦截任何东西。但我确实尝试在客户端拦截请求。请求标头和请求正文已正确设置。
    • 你的 jsonMetadata 是什么样的?
    • 就像张贴的一样。 json的纯文本格式。我能够使用 Wireshark 在服务器端嗅探数据包。它看起来非常好。
    猜你喜欢
    • 2014-09-24
    • 2015-09-03
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2021-08-13
    相关资源
    最近更新 更多