使用Java客户端使用C#REST服务

时间:2016-11-17 10:43:46

标签: java c# wcf-rest

我有以下C#REST服务定义

[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#客户端调用时,相同的服务工作正常。

2 个答案:

答案 0 :(得分:0)

我认为你写入流的方式可能是原因,试试这个:

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

答案 1 :(得分:0)

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

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

此外,如果您有兴趣使代码更清晰,更简洁,请考虑使用Spring RestTemplate进行REST API调用。