【问题标题】:REST API: How to make a `POST` call in `JSON` using Java?REST API:如何使用 Java 在 `JSON` 中进行 `POST` 调用?
【发布时间】:2016-02-02 05:46:04
【问题描述】:

我对制作 REST API 非常陌生。我正在使用Jersy 来制作 API。下面是 REST API 的代码

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)

这里发生了什么?

【问题讨论】:

    标签: java json web-services rest jersey


    【解决方案1】:

    您错误地设置了POST 媒体类型。应该是 MediaType.APPLICATION_JSON_TYPE 而不是 MediaType.APPLICATION_FORM_URLENCODED_TYPE。因此,Jersey 抱怨它无法序列化您的 Track 对象。

    我没有测试过这段代码,但你可以试试这样的:

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

    【讨论】:

    • POST 方法不返回任何内容。是void
    【解决方案2】:

    好的,让我们分解你的错误信息:

    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)
    

    问:您的构建中是否包含 com.tutorialspoint.* 包(包括 Track.class)中所有内容的类文件?在正确的子目录 (com/tutorialspoint/) 中?

    问:“Track”是“Form”的子类吗?你能返回一个实际的“Form”对象吗?

    看这篇文章:

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

    【讨论】:

    • POST 方法不返回任何内容。是void
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多