2016-07-28 6 views
3

Я определил свой метод REST, чтобы вернуть тип данных String в ответ на HTTP-запрос. Это он:Почему нужно возвращать объект Response вместо объекта String в HTTP-запрос в java?

@Path("https://stackoverflow.com/users/{name}/") 
    @GET 
    @Produces("application/json") 
    public String getAllUserMemberships(@PathParam("name") String name) throws Exception{ 

     String doc = "{\"name\":\""+name+"\",\"message\":\"Logged in\"}"; 

     return doc; 
    } 

Он отлично работает, но мне сказали, кто-то, чтобы скорее вернуть javax.ws.rs.core.Response объект, как в примере кода ниже. Это также отлично работает, и он говорит, что это лучший способ ответить на HTTP-запрос, но ОН НЕ ЗНАЕТ ПОЧЕМУ.

@Path("https://stackoverflow.com/users/{name}/") 
    @GET 
    @Produces("application/json") 
    public Response getAllUserMemberships(@PathParam("name") String name) throws Exception{ 

     String doc = "{\"name\":\""+name+"\",\"message\":\"Logged in\"}"; 


     return Response.ok(doc, MediaType.APPLICATION_JSON).build(); 
    } 

МОЯ ПРОБЛЕМА: Нужно ли возвращать объект ответа на запрос HTTP, когда вы можете просто вернуть строку. Если это необходимо, пожалуйста, скажите мне, почему, потому что я в дилемме относительно того, какой из них подходит для HTTP-запроса. Я также опасаюсь, что объект Response может дать мне проблемы, которые я, возможно, не смогу обработать.

+1

Это для удобства. Возможно, вы захотите установить кучу заголовков. Возможно, вы захотите управлять кодом состояния. 'Response' позволяет вам это сделать. 'String' (сам по себе) не делает. –

ответ

7

Если вы возвращаете простую строку, у вас нет контроля над тем, что происходит в случае ошибки. Но если вы вернете объект Response вы можете вернуть правильную ошибку 500 с сообщением об ошибке:

try { 
    return Response.ok(successResult).build(); 
} catch(Exception ex) { 
    return Response.serverError().entity(fault).build(); 
    //or 
    return Response.status(500).entity(fault).build(); 
} 

Как уже сказал, это дает вам контроль над другими аспектами ответа HTTP, как установить некоторые полезные заголовки:

Response response = Response.ok(successResult); 

response.getHeaders().put("Access-Control-Allow-Origin", "*"); 
response.getHeaders().put("Access-Control-Allow-Headers", 
     "origin, content-type, accept, authorization"); 
response.getHeaders().put("Access-Control-Allow-Credentials", "true"); 
response.getHeaders().put("Access-Control-Allow-Methods", 
     "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 

Кроме отправки файла с этим гораздо проще:

File fileToSend = getFile(); 
return Response.ok(fileToSend, "application/zip").build(); 

Итак, есть много причин, если не хотите, чтобы сделать что-нибудь особенное, то просто возвращаемый объект будет достаточным, если вы хотите изменить свойства ответа HTTP, тогда вы должны использовать Response.

1

Объект Response позволяет вам возвращать данные HTTP вместе с ответом вашего метода. Например, объект Response может содержать заголовки, коды ответов и другую соответствующую информацию, которую String не может самостоятельно возвращать. С учетом этого нет, это не обязательно. Ваша программа должна функционировать должным образом с помощью String. Однако было бы полезно и удобно использовать объект Response.

0

Когда вы возвращаете строку, ваше веб-приложение по-прежнему будет предоставлять HTTP-ответ на любые запросы. Указание объекта Response даст вам более прямой контроль. Тэгов должно быть достаточно, чтобы настроить Response для вашей цели, поэтому я бы утвердил, что для чего-то такого простого, создание собственного объекта Response не «лучше».

3

Не нужно.

Но многие люди предпочитают возвращать объект Response всегда, потому что вам необходимо управлять заголовками ответов (помимо тех, что указаны в аннотациях) и другими аспектами ответа, такими как код состояния. Поэтому, если вы иногда возвращаете String и иногда возвращаете Response, это будет выглядеть довольно непоследовательно. Выполнение этого последовательно создает четкий и простой в использовании шаблон.

Если ваше приложение действительно тривиально, то это не имеет значения; в противном случае тот факт, что вы думаете об этом, говорит о том, что стиль имеет значение.