2011-03-01 80 views
8

Tôi đã bắt đầu một dự án nhỏ trong Java.
Tôi phải tạo một ứng dụng khách sẽ gửi xml tới url dưới dạng yêu cầu HTTP POST.
tôi cố nó bằng cách sử java.net.* gói (Sau đây là đoạn mã) nhưng tôi nhận được lỗi như sau:Lỗi trả về cuộc gọi Webservice 500

java.io.IOException: Server returned HTTP response code: 500 for URL: "target url" 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) 
    at newExample.main(newExample.java:36) 

Mã của tôi là như sau:

try { 
     URL url = new URL("target url"); 

     URLConnection connection = url.openConnection(); 

     if(connection instanceof HttpURLConnection) 
      ((HttpURLConnection)connection).setRequestMethod("POST"); 

     connection.setRequestProperty("Content-Length", Integer.toString(requestXml.length())); 
     connection.setRequestProperty("Content-Type","text/xml; charset:ISO-8859-1;"); 
     connection.setDoOutput(true); 
     connection.connect();   

     // Create a writer to the url 
     PrintWriter writer = new PrintWriter(new 
     OutputStreamWriter(connection.getOutputStream())); 

     // Get a reader from the url 
     BufferedReader reader = new BufferedReader(new 
     InputStreamReader(connection.getInputStream())); 

     writer.println(); 
     writer.println(requestXml); 
     writer.println(); 
     writer.flush(); 

     String line = reader.readLine(); 
      while(line != null) { 
        System.out.println(line); 
        line = reader.readLine(); 
      } 


    } catch (MalformedURLException e) { 
        e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Xin giúp với ví dụ thích hợp hoặc bất kỳ cách nào khác để làm điều này.

Lỗi/sai sót điểm ở mã trên hoặc các khả năng khác.

Web Service của tôi là trong khuôn khổ mùa xuân

xml để gửi có định dạng chuỗi: requestXml

+0

Lỗi HTTP 500 là "lỗi máy chủ nội bộ" lỗi chung được trả lại khi dịch vụ gặp lỗi hoặc ném ngoại lệ. Bạn có thể muốn đọc toàn bộ nội dung phản hồi và xem có bất kỳ thông tin nào khác không. Mã lỗi –

+0

500 là Lỗi Máy chủ Nội bộ. Vì vậy, tôi muốn tập trung vào máy chủ chứ không phải là khách hàng thực sự. – sfussenegger

+0

Nếu URL của bạn là chính xác (có thể kiểm tra từ trình duyệt), bạn không thể làm gì nhiều. Có vẻ như lỗi phía máy chủ. – Nishant

Trả lời

3

Vấn đề là bên trong mã máy chủ của bạn hoặc cấu hình máy chủ:

10.5.1 500 Lỗi Máy chủ Nội bộ

Máy chủ gặp phải tình trạng không mong muốn ngăn không cho nó hoàn thành r equest.

(w3c.org/Protocols)

Nếu máy chủ là dưới sự kiểm soát của bạn (nên được, nếu tôi nhìn vào URL [trước khi sửa]), sau đó có một cái nhìn vào các bản ghi máy chủ.

1

Vâng, bạn nên đóng luồng và kết nối của mình. Maangement tài nguyên tự động từ Java 7 hoặc http://projectlombok.org/ có thể trợ giúp. Tuy nhiên, điều này có lẽ không phải là vấn đề chính.

Vấn đề chính là phía máy chủ không thành công. Mã HTTP 500 có nghĩa là lỗi phía máy chủ. Tôi không thể cho bạn biết lý do, bởi vì tôi không biết phần phía máy chủ. Có lẽ bạn nên xem nhật ký của máy chủ.

1

Tôi nghĩ rằng vấn đề của bạn là bạn đang mở luồng đầu vào trước khi bạn đã viết và đóng luồng đầu ra. Chắc chắn, các Sun Tutorial hiện nó theo cách đó.

Nếu bạn mở luồng đầu vào quá sớm, có thể luồng đầu ra sẽ tự động bị đóng, khiến máy chủ nhìn thấy yêu cầu POST trống. Điều này có thể là đủ để làm cho nó bị lẫn lộn và gửi một phản ứng 500.

Ngay cả khi đây không phải là điều gây ra 500 lỗi, bạn nên làm mọi thứ theo thứ tự được nêu trong hướng dẫn. Để bắt đầu, nếu bạn vô tình đọc phản hồi trước khi bạn viết xong yêu cầu, bạn có khả năng (ít nhất là tạm thời) khóa kết nối. (Trong thực tế, có vẻ như mã của bạn đang làm điều này bởi vì bạn không đóng nhà văn trước khi đọc từ người đọc.)

Một vấn đề riêng biệt là mã của bạn không đóng kết nối trong mọi trường hợp, và do đó chịu trách nhiệm để rò rỉ kết nối mạng. Nếu nó làm điều này nhiều lần, nó có khả năng dẫn đến nhiều IOExceptions.

21

Vấn đề nằm ở bên dưới đang

// Get a reader from the url 
BufferedReader reader = new BufferedReader(new 
InputStreamReader(connection.getInputStream())); 

Là dịch vụ có thể không luôn luôn trả lại cho bạn những phản ứng thích hợp ... như bạn đang gọi một dịch vụ thông qua http, nó có thể được có thể là máy chủ chính nó không phải là có sẵn hoặc dịch vụ không khả dụng. Vì vậy, bạn nên luôn kiểm tra mã phản hồi trước khi đọc phản hồi từ luồng, dựa trên mã phản hồi mà bạn quyết định có đọc nó từ inputStream để trả lời thành công hay từ errorStream cho điều kiện lỗi hoặc ngoại lệ.

BufferedReader reader = null; 

if(connection.getResponseCode() == 200) 
{ 
reader = new BufferedReader(new 
InputStreamReader(connection.getInputStream())); 
} 
else 
{ 
reader = new BufferedReader(new 
InputStreamReader(connection.getErrorStream())); 
} 

Điều này sẽ giải quyết vấn đề

+0

Câu trả lời hay! –

0

Nếu bạn đang gọi một Webservice bên ngoài và đi qua một JSON trong cuộc gọi REST, kiểm tra kiểu dữ liệu của giá trị được truyền.

Ví dụ:

{ "originalReference":"8535064088443985", 
    "modificationAmount": 
    { "amount":"16.0", 
     "currency":"AUD" 
    }, 
    "reference":"20170928113425183949", 
    "merchantAccount":"MOM1" 
} 

Trong ví dụ này, giá trị của lượng đã được gửi như là một chuỗi và cuộc gọi webservice thất bại với Máy chủ trả lại mã phản hồi HTTP: 500. Nhưng khi lượng: 16.0 là đã gửi, tức là một Số nguyên đã được chuyển, cuộc gọi đã được thực hiện. Mặc dù bạn đã giới thiệu tài liệu API trong khi gọi các API bên ngoài như vậy nhưng các chi tiết nhỏ như thế này có thể bị bỏ qua.

Các vấn đề liên quan