REST API:如何使用 Java 在 `JSON` 中调用 `POST`?
REST API: How to make a `POST` call in `JSON` using Java?
我对制作 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.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_JSON_TYPE
而不是 MediaType.APPLICATION_FORM_URLENCODED_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)
问:class 包 com.tutorialspoint.*(包括 Track.class)中所有内容的文件是否在您的构建中?在正确的子目录 (com/tutorialspoint/)?
问:"Track" 是 "Form" 的子class 吗?你能 return 一个实际的 "Form" 对象吗?
看看这个post:
我对制作 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.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_JSON_TYPE
而不是 MediaType.APPLICATION_FORM_URLENCODED_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)
问:class 包 com.tutorialspoint.*(包括 Track.class)中所有内容的文件是否在您的构建中?在正确的子目录 (com/tutorialspoint/)?
问:"Track" 是 "Form" 的子class 吗?你能 return 一个实际的 "Form" 对象吗?
看看这个post: