【问题标题】:send XML string to web service in Jersery将 XML 字符串发送到 Jersey 中的 Web 服务
【发布时间】:2013-06-12 16:44:56
【问题描述】:

我是 jersey 网络服务的新手。我创建了一个 Web 服务,代码如下

@Path("/remotedb")
public class RemoteDb {

@GET
@Path("/save/{xmlData}")
@Produces(MediaType.TEXT_XML)
public String saveData(@PathParam("xmlData") String xml) {
    return xml;
    }
}

我在客户端有这段代码

public class WebServiceClient {

public static void callWebService() {
  String xml =  "<data>" +
        "<table><test_id>t4</test_id><dateprix>2013-06-06 22:50:40.252</dateprix><nomtest>NOMTEST</nomtest><prixtest>12.70</prixtest><webposted>N</webposted><posteddate>2013-06-06 21:51:42.252</posteddate></table>" +
            "</data>";
     ClientConfig config = new DefaultClientConfig();
     Client client = Client.create(config);
     WebResource service = client.resource(getBaseURI());
  System.out.println(service.path("restful").path("remotedb").path("save").path(xml).accept(MediaType.TEXT_XML).get(String.class));

  }

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost:8080/WebServiceModule").build();
    }
} 

现在当我调用 Web 服务时,我得到了以下异常

Exception in thread "main" com.sun.jersey.api.client.UniformInterfaceException: GET    http://localhost:8080/WebServiceModule/restful/remotedb/save/%3Cdata%3E%3Ctable%3E%3Ctest_id%3Et4%3C/test_id%3E%3Cdateprix%3E2013-06-06%2022:50:40.252%3C/dateprix%3E%3Cnomtest%3ENOMTEST%3C/nomtest%3E%3Cprixtest%3E12.70%3C/prixtest%3E%3Cwebposted%3EN%3C/webposted%3E%3Cposteddate%3E2013-06-06%2021:51:42.252%3C/posteddate%3E%3C/table%3E%3C/data%3E returned a response status of 404 Not Found
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:686)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:507)
at com.main.WebServiceClient.callWebService(WebServiceClient.java:25)
at com.main.Test.main(Test.java:7)

【问题讨论】:

  • 我怀疑泽西岛可能被 XML 数据中的所有 / 搞糊涂了。它将对特殊字符(例如 )进行 URLEncode,但它不知道 / 是 XML 的一部分而不是 URL 的一部分。您可以使用 URLEncoder 并自己编码 XML 字符串吗?另外,您确定要在 URL 中而不是在实体正文中发送该数据吗?这看起来更像是 POST 数据,而不是 url 路径。
  • 如何使用 URLEncoder??

标签: java xml web-services jersey


【解决方案1】:

在路径段中传递 XML 数据是非常不正统的,并且可能会引发各种问题。您应该将其作为查询参数传递,例如/WebServiceModule/restful/remotedb/save?xmlData= %3C数据...

@GET
@Path("/save")
@Produces(MediaType.TEXT_XML)
public String saveData(@QueryParam("xmlData") String xml) {
    return xml;
    }
}

如果顾名思义它是一个写操作,那么它应该是一个 POST /WebServiceModule/restful/remotedb/save 并在请求正文中传递 xmlData。

@POST
@Path("/save")
@Produces(MediaType.TEXT_XML)
public String saveData(String xml) {
    return xml;
    }
}

或者更好的是,如果您可以使用 JAXB 的 @XmlRootElement 注释将您的 xmlData 映射到 POJO,那么您可以让 jersey 为您解析它:

@POST
@Path("/save")
@Consumes(MediaType.APPLICATION_XML)
public String saveData(YourXmlDataObject obj) {
    return obj.getField();
    }
}

【讨论】:

  • 我正在调用一个 POST 方法,其中我的一个参数已在其中编码了 xml。我正在使用@FormParam("formula") 访问它。但是,它的值是空白的。我在通话期间传递编码的 xml。我不知道为什么它在 Java 调用中是空白的。我还在我的方法中使用了“@Consumes(MediaType.APPLICATION_FORM_URLENCODED)”注释。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2012-02-27
相关资源
最近更新 更多