2016-02-02 1 views
1

Я очень новичок в создании REST API. Я использую Jersy для создания API. Ниже приведен код для REST APIREST API: как сделать вызов `POST` в` JSON` с помощью Java?

import java.util.ArrayList; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

/** 
* 
* @author Yohan 
*/ 
@Path("/json/metallica") 
public class JsonService { 

    @GET 
    @Path("/getTrackInJSON") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Track getTrackInJSON() { 

     Track track = new Track(); 
     track.setTitle("Enter Sandman"); 
     track.setSinger("Metallica"); 

     return track; 

    } 

     @GET 
    @Path("/getTrackArray") 
    @Produces(MediaType.APPLICATION_JSON) 
    public ArrayList<Track> getTrackArray() { 

      ArrayList<Track> list = new ArrayList<Track>(); 

      for(int i=0;i<10;i++) 
      { 
       Track track = new Track(); 
     track.setTitle("Enter Sandman: "+i); 
     track.setSinger("Metallica"); 

       list.add(track); 
      } 


     return list; 

    } 

    @POST 
    @Path("/post") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public void createTrackInJSON(Track track) { 

     String result = "Track saved : " + track; 
       System.out.println(result); 


    } 

} 

Теперь, я попробовал GET команды, теперь нужно попробовать POST команды. Я написал код ниже, в отдельном пакете того же проекта.

import com.tutorialspoint.Track; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 


public class JerseyClientPost { 

    public static void main(String[] args) { 

    try { 

     Client client = ClientBuilder.newClient(); 
       WebTarget target = client.target("http://localhost:8080/RESTFUL_API_SAMPLE/rest/json/metallica/").path("/post"); 

       Track track = new Track(); 
     track.setTitle("Enter Sandman: "); 
     track.setSinger("Metallica"); 
       Track bean = 
target.request(MediaType.APPLICATION_JSON_TYPE) 
    .post(Entity.entity(track,MediaType.APPLICATION_FORM_URLENCODED_TYPE), 
     Track.class); 


     } catch (Exception e) { 

     e.printStackTrace(); 

     } 

    } 
} 

Теперь я получаю следующее сообщение об ошибке.

Feb 02, 2016 11:11:02 AM org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo 
SEVERE: MessageBodyWriter not found for media type=application/x-www-form-urlencoded, type=class com.tutorialspoint.Track, genericType=class com.tutorialspoint.Track. 
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/x-www-form-urlencoded, type=class com.tutorialspoint.Track, genericType=class com.tutorialspoint.Track. 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) 
    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:502) 
    at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:388) 
    at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:285) 
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:255) 
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:700) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:696) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:448) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:349) 
    at JerseyClientPost.main(JerseyClientPost.java:38) 
BUILD SUCCESSFUL (total time: 1 second) 

Что здесь произошло?

ответ

1

Вы неправильно установили тип носителя POST. Должно быть MediaType.APPLICATION_JSON_TYPE вместо MediaType.APPLICATION_FORM_URLENCODED_TYPE. Jersey лишь сожалеет, что не может произвести сериализацию вашего Track.

Я не проверял этот код, но вы можете попробовать что-то вроде этого:

target.request().post(Entity.json(track)); 
+1

Параметр 'Метод Post' ничего не возвращают. Это 'void' –

+0

Так или иначе, это сработало хорошо. Спасибо. –

1

ОК, давайте сломаем ваше сообщение об ошибке:

SEVERE: MessageBodyWriter not found for media type=application/x-www-form-urlencoded, 
    type=class com.tutorialspoint.Track, 
    genericType=class com.tutorialspoint.Track. 

Это выглядит нормально:

.post(Entity.entity(track,MediaType.APPLICATION_FORM_URLENCODED_TYPE), Track.class) 

Q: Являются ли файлы классов для всего в пакете com.tutorialspoint. * (Включая Track.class) в вашем b uild? В правильном подкаталоге (com/tutorialspoint /)?

В: Подходит ли «Трек» к подклассу «Форма»? Вы можете вернуть реальный объект «Форма»?

Посмотрите на этот пост:

jersey-client MessageBodyWriter not found for media type=application/x-www-form-urlencoded

+0

Метод 'POST' ничего не возвращает. Это 'void' –

Смежные вопросы