我試圖實現基於java的web服務服務器,該服務器返回到基於Json和Java腳本的Web服務客戶端。這裏是我的Java部分:如何在Java響應對象中返回JsonArray
@Path("/myapp")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class MyRecommender {
@POST
@Path("/recs")
public Response getRecommendations() {
//Assume recommendation List contains some Recommendation objects
//I removed it for simplicity.
List<Recommendation> recommendation;
JsonArrayBuilder builder = Json.createArrayBuilder();
for (Recommendation rec : recommendations) {
builder.add(Json.createObjectBuilder().add("firstPersonName", "\"" + rec.getFirstPerson().getName() + "\"")
.add("firsPersonURL", "\"" + rec.getFirstPerson().getURL() + "\"")
.add("secondPersonName", "\"" + rec.getSecondPerson().getName() + "\"")
.add("secondPersonURL", "\"" + rec.getSecondPerson().getURL() + "\"")
.add("score", "\"" + rec.getSimilarity() + "\""));
}
JsonArray jsonData = builder.build();
return Response.ok(jsonData, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();
}
}
}
現在,當我調用此函數從我的js的客戶,我得到:
POST http://localhost:8080/myapp/recs 500 (Request failed.)
但是,當我更換for循環,並與下面的代碼返回剪斷我正確地在我的js中得到了迴應。
變更部分:
// remove for loop and change jsonData type.
String jsonData = "{\"name\":\"John\"}";
return Response.ok(jsonData, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();
所以,我想可能是什麼問題呢?自從我第一次使用Web服務以來,我有一些困難來調試我的代碼。
編輯
順便說一句,我還得到另一個錯誤,當我嘗試getRecommendations的第一個版本()函數(帶環)
XMLHttpRequest cannot load http://localhost:8080/myapp/recs.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:3000' is therefore not allowed access.
The response had HTTP status code 500.
但正如我所說,當我刪除循環並將第二個代碼剪切到getRecommendations()函數中,這兩個錯誤都消失了,我在我的網站上得到響應。
EDIT2
當我改變了迴路上與再次返回下面我getRecommendations的聲明()函數得到同樣的錯誤
JsonObject value = Json.createObjectBuilder()
.add("name", "John").build();
return Response.ok(value, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "POST").allow("OPTIONS").build();
編輯3
據我所知,createObjectBuilder().build()
或JsonArrayBuilder.build()
返回一個JSON object
及以下的這個構建語句在我的getRecommendations()函數中甚至沒有運行。所以,我認爲我的問題我怎麼能給這個對象授予Access-Control-Allow-Origin權限?
HTTP 500是內部服務器錯誤。你是否檢查服務器是否連接並正常工作? – Dipu
@SudiptoChandra是的,正如我所說的,如果我將getRecommendations()函數的循環和返回語句替換爲第二個代碼,它將正常工作。所以我不認爲可能有任何連接問題。 – zwlayer
恕我直言'getRecommendations()'應該註解'@ GET' – PeterMmm