2011-03-01 14 views
8

Ho avviato un piccolo progetto in Java.
Devo creare un client che invierà xml a un url come richiesta HTTP POST.
ho provato usando java.net.* pacchetto (seguito è il pezzo di codice), ma io sono errore ricevendo come segue:Errore di restituzione chiamata 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) 

Il mio codice è il seguente:

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(); 
    } 

prega di aiutare con esempi adatti o qualsiasi altro modo per farlo.

Errori/errori del punto nel codice sopra o altre possibilità.

My Web Il servizio è a molla quadro

XML per inviare è nel formato stringa: requestXml

+0

Errore HTTP 500 è "errore del server interno" un errore generico restituito quando il servizio rileva un errore o genera un'eccezione. Si potrebbe voler leggere il corpo della risposta completa e vedere se ha ulteriori informazioni –

+0

codice di errore 500 è un errore interno del server. Quindi mi concentrerei sul server piuttosto che sul client. – sfussenegger

+0

Se il tuo URL è corretto (può controllare dal browser), non c'è molto che tu possa fare. Sembra un errore lato server. – Nishant

risposta

3

Il problema è dentro il codice del server o la configurazione del server:

10.5.1 Errore interno server 500

Il server ha riscontrato una condizione imprevista che gli ha impedito di soddisfare la r equest.

(w3c.org/Protocols)

Se il server è sotto il vostro controllo (dovrebbe essere, se guardo l'URL [prima della modifica]), poi uno sguardo ai log del server.

1

Bene, è necessario chiudere i flussi e le connessioni. Il supporto automatico delle risorse da Java 7 o http://projectlombok.org/ può essere d'aiuto. Tuttavia, questo probabilmente non è il problema principale.

Il problema principale è che il lato server non riesce. Il codice HTTP 500 indica un errore lato server. Non posso dirvi il motivo, perché non conosco la parte lato server. Forse dovresti controllare il registro del server.

1

Penso che il problema è che si sta aprendo il flusso di input prima di aver scritto e chiuso il flusso di output. Certamente, lo Sun Tutorial fa così.

Se si apre il flusso di input troppo presto, è possibile che il flusso di output venga chiuso automaticamente, facendo in modo che il server visualizzi una richiesta POST vuota. Questo potrebbe essere sufficiente a farlo confondere e inviare una risposta 500.

Anche se questo non è ciò che causa gli errori 500, è una buona idea fare le cose nell'ordine indicato nel tutorial. Per cominciare, se accidentalmente leggi la risposta prima di aver finito di scrivere la richiesta, è probabile che tu (almeno temporaneamente) blocchi la connessione. (In effetti, sembra che il tuo codice stia facendo questo perché non stai chiudendo lo scrittore prima di leggere dal lettore.)

Un altro problema è che il tuo codice non chiude la connessione in tutte le circostanze ed è quindi responsabile per perdere connessioni di rete. Se lo fa ripetutamente, è probabile che porti a più IOExceptions.

21

Il problema sta nel sottostante Codice

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

Come il servizio potrebbe non sempre si restituisce la risposta corretta ... come si chiama un servizio tramite http, può essere possibile che il server stesso non è disponibile o il servizio non è disponibile. Pertanto, è necessario verificare sempre il codice di risposta prima di leggere la risposta dagli stream, in base al codice di risposta che si deve decidere se leggerlo da inputStream per la risposta positiva o da errorStream per condizione di errore o di eccezione.

BufferedReader reader = null; 

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

Questo risolverebbe il problema

+0

Ottima risposta! –

0

Se si chiama un servizio Web esterno e il superamento di un JSON nella chiamata REST, verificare il tipo di dati dei valori passati.

Esempio:

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

In questo esempio, il valore di importo è stato inviato come una stringa e la chiamata webservice riuscita con Server tornato codice di risposta HTTP: 500. Ma quando la quantità: 16.0 era inviato, ovvero è stato passato un intero, la chiamata è andata a buon fine. Sebbene tu abbia indirizzato la documentazione dell'API mentre chiami tali API esterne, piccoli dettagli come questo potrebbero essere persi.

Problemi correlati