朋友!Android上NanoHTTPD的意外HTTP 400狀態碼
我在我的Android應用程序中收到來自nanohttpd
的偶然和意外的HTTP 400響應。錯誤遵循特定模式。我已經看了一段時間了,但我已經到了需要不同角度或其他幫助指向正確方向的地步。
您能否看看並分享您的想法,甚至直接提出意見和建議?
- 爲什麼我得到這個HTTP 400狀態碼?
- 爲什麼只有在給定的情況下? (我不希望它在所有!)
一些背景
我在我的Android項目運行nanohttpd
作爲臨時隔離層(由於服務器端的不是成熟,還不足以) 。我在Android Service
中隔離了nanohttpd
服務器,該服務器在創建後從我的自定義Application
對象開始。這種方式nanohttpd
不綁定到任何特定的生命週期,但可以獨立於整個應用程序邏輯和組件生命週期而生活。
的問題
現在,(幾乎)一切工作很好,很正常,我可以開始nanohttpd
並執行一些初始的登錄請求,我希望模擬響應甚至交付。當我執行我的第一個「GET」請求時,儘管如此,nanohttpd
會向我發出400個錯誤的請求狀態,但只有第一次。如果我退出負責特定「GET」請求的Activity
,並再次(從主屏幕)啓動它,它將以200狀態完美地提供預期的有效負載。
我做了這麼遠
我曾在nanohttpd
源代碼,仔細一看,試圖追查地方,爲什麼這400個狀態設置。這種狀態碼的使用並不是很多地方。粗略地說只有here,here和here。由於我沒有處理多部分內容,因此我只剩下第一個和第三個「在這裏」。但是 - 當然 - 我不能在我的生活中找到400身份的根本原因,也不能確定哪個確切的區塊會爲我造成這種狀態。當我調試代碼時,一切都正常工作。
一些代碼
這大致就是我nanohttpd
Service
(MyNanoHttpdService
)看起來像:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (ACTION_START.equals(intent.getAction())) {
String errorMessage = null;
if (myNanoHttpd == null) {
String hostUrl = intent.getStringExtra(EXTRA_HOST);
Uri uri = Utils.notEmpty(hostUrl) ? Uri.parse(hostUrl) : Uri.EMPTY;
myNanoHttpd = new MyNanoHttpd(this, uri.getHost(), uri.getPort(), null);
}
if (!myNanoHttpd.isAlive()) {
try {
myNanoHttpd.start();
} catch (IOException e) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
errorMessage = stringWriter.toString();
stopSelf();
}
}
final ResultReceiver resultReceiver = intent.getParcelableExtra(EXTRA_RESULT_LISTENER);
if (resultReceiver != null) {
int status = myNanoHttpd.isAlive() ? CODE_SUCCESS : CODE_FAILURE;
Bundle bundle = new Bundle();
bundle.putString(EXTRA_MESSAGE, errorMessage);
resultReceiver.send(status, bundle);
}
}
return Service.START_STICKY;
}
這是我開始從我的自定義Application
對象的服務,初始化我的客戶端狀態並獲取一些內容:
@Override
public void onCreate() {
super.onCreate();
// Yes, that is a Java 8 Lambda you see there!
MyNanoHttpdService
.start(this, "http://localhost:8080")
.withStartupListener((status, message) -> {
if (status == 0) {
// POST REQUEST: Works like a charm
myNetworkHelper.login();
// GET REQUEST: Always fails on first launch
myNetworkHelper.getContent();
} else {
Log.e("LOG_TAG", "Couldn't start MyNanoHttpd: " + message);
}
});
}
假設包裝便利代碼(.withStartupListener(...)
- 基本上包裝Service
所使用的ResultReceiver
- 和myNetworkHelper
對象)按預期工作是安全的。此外,在製作中,getContent()
電話將由Activity
或Fragment
撥打,但爲了方便起見,我現在已將其撥至Application
。