2011-08-18 76 views
3

在我的應用程序中,我將一個xml文件發送到服務器,但有時服務器將發回302,然後重定向。如何使用HttpClient處理post方法中的重定向?

但是,在重定向的方法變成GET後,沒有POST,並且我的數據在xml文件中無法傳遞到服務器。

最後我得到了狀態代碼爲404。

是有一些方法由我自己來處理重定向?重定向發生時我能做些什麼嗎?

任何人都可以幫忙嗎?謝謝。!

回答

5

RFC 2616

如果響應於比​​ GET或HEAD其他的請求被接收到302個狀態代碼,用戶代理不必自動重定向 請求,除非它可以由用戶來確認,因爲這可能會改變發出請求的條件。

你確定你的服務器沒有使用'POST, redirect, GET'成語嗎?

您可以在Apache HTTP客戶端中使用disable automatic following of redirects。例如:

_httpClient = new DefaultHttpClient(); 
_httpClient.getParams().setParameter(
    ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE); 
+0

謝謝,我試過這種方式。現在它起作用了。 – xuyao

+0

謝謝,這是我可以使用的唯一解決方案,因爲我的HttpClient是由工廠生成的,我不希望重寫(Spring框架的一部分),所以我只能在構建後訪問它。 –

+0

只是爲了防止任何人讀到這裏:看看這裏:https://stackoverflow.com/a/45893624/1087479我不得不編輯我的答案,涵蓋了類似的話題,因爲RFC 2616被RFC 7231-35所取代。 – sschrass

0

爲了記錄,302不應被視爲執行重定向請求的指令作爲GET,這是303的目的。這種行爲是草率的,HttpClient的開發人員應該爲自己感到羞恥... :-P

我懷疑你唯一的選擇是編寫你自己的,一個HTTP客戶端的套接字級實現,它正確地處理重定向。你可以在互聯網上查看是否有其他人已經生成了一些你可以借用的代碼,但是如果沒有,你將不得不自己做。

我已經在PHP中完成了這項工作 - 實際上並不難,HTTP是一個相當簡單的協議。我認爲cURL可以正確處理這些重定向,如果你可以將任務分配給那個呢?