Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RESTAPI:如何使用Java在`JSON`中进行`POST`调用?_Java_Json_Web Services_Rest_Jersey - Fatal编程技术网

RESTAPI:如何使用Java在`JSON`中进行`POST`调用?

RESTAPI:如何使用Java在`JSON`中进行`POST`调用?,java,json,web-services,rest,jersey,Java,Json,Web Services,Rest,Jersey,我对制作RESTAPI非常陌生。我正在使用Jersy制作API。下面是RESTAPI的代码 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 ja

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

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);


    }

}
现在我得到以下错误

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)

这里发生了什么事

您设置的
POST
媒体类型不正确。应该是
MediaType.APPLICATION\u JSON\u TYPE
而不是
MediaType.APPLICATION\u FORM\u URLENCODED\u TYPE
。因此,Jersey抱怨它无法序列化
Track
对象

我尚未测试此代码,但您可以尝试以下操作:

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

好的,让我们分析一下您的错误消息:

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”的一个子类吗?你能返回一个实际的“表单”对象吗

请看这篇文章:


POST方法不返回任何内容。它是
void
POST
方法不返回任何内容。它是
void
.post(Entity.entity(track,MediaType.APPLICATION_FORM_URLENCODED_TYPE), Track.class)