2016-11-17 144 views
0

我有下面的C#REST服务定义消耗C#REST服务,Java客户端

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = "books/{isbn}")] 
void CreateBook(string isbn, Book book); 

我想从Java客户端消费这项服务。

String detail = "<Book><Autor>" + autor + "</Autor><ISBN>" + isbn + "</ISBN><Jahr>" + jahr + "</Jahr><Titel>" + titel + "</Titel></Book>"; 
    URL urlP = new URL("http://localhost:18015/BookRestService.svc/books/" + isbn); 
    HttpURLConnection connectionP = (HttpURLConnection) urlP.openConnection(); 
    connectionP.setReadTimeout(15*1000); 
    connectionP.setConnectTimeout(15*1000); 
    connectionP.setRequestMethod("POST"); 
    connectionP.setDoOutput(true); 
    connectionP.setRequestProperty("Content-Type", "application/xml"); 
    connectionP.setRequestProperty("Content-Length", Integer.toString(detail.length())); 
    OutputStream os = connectionP.getOutputStream(); 
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(os)); 
    pw.println(detail); 
    pw.flush(); 
    pw.close(); 
    int retc = connectionP.getResponseCode(); 
    connectionP.disconnect(); 

服务返回400给我的Java客户端。从C#客户端调用时,相同的服务工作正常。

+0

400意味着一个错误的请求 - 但通常服务器会告诉你它有什么坏处(格式错误的XML,缺少头文件等)。所以能够看到回复的状态行和主体内容会很棒。另外,使用实际的休息客户端可能会帮助理解这个问题。 (spring rest模板,cxf,...) –

+0

要完成@JoeriHendrickx答案,我会说你有两个客户端的不同响应,原因很简单:你不发送相同的请求。您可以使用工具(如https://requestb.in/)分析两个客户端实际发送的http请求,并查看其中的不同之处。你也可以在这里发布结果。 – Gildas

回答

0

我觉得你写的流这种方式可能是这个原因,试试这个:

connectionP.setDoOutput(true); 
DataOutputStream out = new DataOutputStream(connectionP.getOutputStream()); 
out.writeBytes(detail); 
out.flush(); 
out.close(); 
0

在服务器代码使用UriTemplate = "books/{isbn}为URI模板,但您的客户端代码指定的URI作为"http://localhost:18015/BookRestService.svc/booksplain/" + isbn

也许您只需要更改Java代码中的URI以反映服务器URI,例如“books”而不是“booksplain”"http://localhost:18015/BookRestService.svc/books/" + isbn

另外,如果你有兴趣使您的代码更清洁和更简洁,可以考虑使用Spring RestTemplate制作REST API调用。

+0

感谢您指向书籍和书籍。这是一个错字。我其实用书本试了一下,它不起作用。 –