2010-01-20 14 views
7

Come si esegue un PUT HTTP? La classe che sto usando sembra pensare che stia facendo un PUT ma l'endpoint lo sta trattando come se avessi fatto un GET. Sto facendo qualcosa di sbagliato?Java: HTTP PUT con HttpURLConnection

URL url = new URL("https://..."); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoOutput(true); 
conn.setRequestMethod("PUT"); 

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); 

writer.write(xmlString); 
writer.close(); 

System.out.println(conn.getRequestMethod()); 
String response = readInputStream(conn.getInputStream()); 
System.out.println(response); 

in fase di stampa:

PUT 
<same content as doing a GET> 

preferirei non include un'altra libreria, se questo potrebbe funzionare ...

risposta

5

C'è un modo semplice per scoprire: correre Wireshark e vedere cosa è in realtà in corso sulla rete. Ho scoperto che questo è il modo più affidabile per diagnosticare questo tipo di problema: il tuo client potrebbe avere bug, la libreria potrebbe avere bug, il server potrebbe avere bug, ma Wireshark ti mostrerà cosa sta realmente accadendo.

MODIFICA: Va bene, per HTTPS è un po 'più complicato. Puoi usare Fiddler se stai usando Windows, che è un proxy - può far fronte a HTTPS se puoi convincere il tuo codice client ad accettare il suo certificato, ma è un po 'più invadente ... mettere un proxy in modo chiaro cambia l'aspetto del traffico.

Sarebbe meglio se si potesse parlare con una versione di debug del server su HTTP invece. È fattibile nel tuo caso o il server è completamente fuori dal tuo controllo?

+0

Tutto il mio traffico è https al server remoto ... e wireshark non può vedere molto all'interno di lì. Colpire con curl vs da java sembra diverso, ma cosa dovrei cercare? –

+0

Buona idea. Li ho contattati e ho ottenuto un server HTTP per il test. Ho scoperto che il mio problema era la mancanza di un'intestazione Content-Type rifiutata dal loro server. Grazie mille. –