先貼上程式碼
public static function backCall($data = '', $msg = '成功', $code = 200)
{
$response = response()
->json(['code' => $code, 'msg' => $msg, 'data' => $data], $code)
->setEncodingOptions(JSON_UNESCAPED_UNICODE);
$response->send();
}
上面這一段其實我是寫給api回應固定值用的。
在使用上沒啥問題。
主要是後面的send()。當初是網路上查到的資料。為了要讓程式再回應後就中斷之後的運行加上的。
也就是說,一但程式運行到這邊就會回應一個json值。不會再往下運行了。
但這幾天發生了一個個案問題。
其實程式開發一直都是5個人在共同運行開發。該段程式碼從一開始就存在。
原本使用上都一直相安無事。
但最近其中一個發生了不會中斷程式的問題
如以下的程式
<?php
if($error){
$msg = "無效的請求";
sysRep::backCall([],$msg,500);
}
$data = [...]
.(省略)
sysRep::backCall($data);
?>
正常來說。如果error發生錯誤後。會回應一個錯誤的json並不在往下運行。
但其中一位工程師。他確發生了會往下運行不會中斷的情況。
然後拿到了兩段json。
這樣子當然會沒辦法做好回應。
由於另外4位並沒有發生這樣的情況。程式碼後來也用git同步了。
也只有他會發生這樣的問題。
且除了正式站是採用nginx的server運行之外。
開發人員都是在本機端使用 laravel 的內置server在開發。
唯一不同的是,其它4人都是windows的系統。有出問題的這位是用mac開發。
不過正常來講也不該有這樣的情況,畢竟在之前並不會發生這樣的事。
是最近才發生的。且使用的也是內置的server運行。
有請他試著api請求到正式站。是可以正常的。
目前只能推斷是他用的web server有問題。
可是因為使用的也只是單純 laravel 內置的server。也想不到是否有什麼設定發生了啥問題。
也思考不到是什麼問題會發生這樣的事。
想問看看這邊的大佬們,能否幫忙思考一下還有什麼可能性會發生這樣的事。
但因為是個案。我現在也無法自行測試。畢竟我這邊使用是正常的。
=============================
後續找到問題了。其實後來發現是在特定區段才會發生這樣的事。
查了一下。居然是我忘了加上return造成的。
而且我也誤會了send會中斷的事了。一切都是我自已搞錯了。其send並不會中斷的@@"
並不確定這是不是特例,但作為伺服器回應一慣使用return回應,下面這個例子沒有return只以send()的確可以取得重複json response
若使用send()與return將會重複輸出一樣的結果,所以使用return response()->json();可能比較沒問題
<?php
/**
* 第一種
* 輸出{"code":200}{"code":404}
* /
$response = response()
->json([
'code' => 200
], 200)
->setEncodingOptions(JSON_UNESCAPED_UNICODE)
->send();
$response = response()
->json([
'code' => 404
], 404)
->setEncodingOptions(JSON_UNESCAPED_UNICODE)
->send();
/**
* 第二種
* 輸出{"code":200}{"code":200}
* /
$response = response()
->json([
'code' => 200
], 200)
->setEncodingOptions(JSON_UNESCAPED_UNICODE)
->send();
return $response;
$response = response()
->json([
'code' => 404
], 404)
->setEncodingOptions(JSON_UNESCAPED_UNICODE)
->send();
return $response;
/**
* 第三種
* 輸出{"code":200}
* /
$response = response()
->json([
'code' => 200
], 200)
->setEncodingOptions(JSON_UNESCAPED_UNICODE);
return $response;
$response = response()
->json([
'code' => 404
], 404)
->setEncodingOptions(JSON_UNESCAPED_UNICODE)
->send();
return $response;