package java4s;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/vinay")
public class JsonFromRestful {
@POST
@Path("/{runID}/{tweetID}/{tweet : .*}")
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello( @PathParam("runID") String rid,
@PathParam("tweetID") String tid,
@PathParam("tweet") String twt) throws IOException, InterruptedException {
StringBuffer resneel=new StringBuffer();
resneel.append(rid);
resneel.append(tid);
resneel.append(twt);
return return resneel.toString();
}
}
client test program
package neel;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.MultivaluedMapImpl;
/*
* excerpt of the maven dependencies
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19</version>
</dependency>
*/
public class ClientTest {
public static void main(String[] args)
{
if(args.length != 4)
{
System.out.println("Incorrect parameters, usage:");
System.out.println("java -jar neelclienttest.jar run_id tweet_id tweet_to_annotate rest_api");
System.exit(1);
}
String runID = args[0];
String tweetID = args[1];
String tweet = args[2];
String uri = args[3];
try {
String annotations = annotate(uri, runID, tweetID, tweet);
System.out.println(annotations);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String annotate(String uri, String runID, String tweetID, String tweet) throws Exception
{
Client client = Client.create();
WebResource webResource = client.resource(uri);
MultivaluedMap<String,String> params = new MultivaluedMapImpl();
params.add("RunID", runID);
params.add("TweetID", tweetID);
params.add("Tweet", tweet);
ClientResponse response = webResource.
accept(MediaType.TEXT_PLAIN_TYPE).
post(ClientResponse.class, params);
// check if status code != 200 OK
if ( response.getStatus() != 200 )
throw new Exception ("The REST interface has answered with an unexpected status code" + response.getStatus());
return response.getEntity(String.class);
}
}
这里我给出命令行争论runid tweetid tweet,路径为http://localhost/cen_neel/vinay/,但它显示了java.lang异常。我们创建了一个Web服务,无论我给客户端测试的是什么。我不需要客户端测试中的任何更改。如果我的程序有任何错误,请提供帮助。我使用下面的restclient插件测试了相同的程序 http://localhost/cen_neel/vinay/r12/v23/Chennai我正在得到正确回复。
答案 0 :(得分:0)
此处post(ClientResponse.class, params);
。您尝试将URI信息发布到请求正文中。那不是他们所属的地方。实际上,根据你的资源方法,根本不应该是一个机构。你可以简单地传递一个空字符串。
相反,您应该如何构建请求,.path()
上的WebResource
附加路径段
ClientResponse response = webResource
.path(runID)
.path(tweetID)
.path(tweet)
.accept(MediaType.TEXT_PLAIN_TYPE)
.post(ClientResponse.class, "");
但是,你做这件事的方式似乎毫无意义。为什么不直接传递整个URI,就像你在Rest Client中一样。
无论如何,这并不是一个好的设计。以下是我要做的一些改进。
实际的推文不应该在URI中。它应该贴在身上。要在正文中接受它,只需使用@PathParam
方法参数对tweet
进行注释,然后删除路径模板{tweet : .*}
。然后你可以post(ClientReponse.class, tweet)
。您还应该将@Consumes(MediaType.TEXT_PLAIN)
添加到资源方法,并使用type
创建请求。即。
.accept(MediaType.TEXT_PLAIN_TYPE)
.type(MediaType.TEXT_PLAIN_TYPE)
.post(ClientResponse.class, tweet);
如果您尝试创建新推文,则ID不应位于模板中。 id不应该存在。创建推文时,服务器应通过新创建的推文ID通知客户端,并带有Location
标题。