Java 如何使用Jesrey发布表单数据?
我是新泽西人。我试图使用jersey call发布两个表单数据。以下是我的代码Java 如何使用Jesrey发布表单数据?,java,rest,jersey,Java,Rest,Jersey,我是新泽西人。我试图使用jersey call发布两个表单数据。以下是我的代码 public class Test { private static String baseuri = "http://json/authenticate"; /** * @param args */ public static void main(String[] args) { try { Cl
public class Test {
private static String baseuri = "http://json/authenticate";
/**
* @param args
*/
public static void main(String[] args) {
try {
Client client = Client.create();
WebResource webResource = client.resource(baseuri);
MultivaluedMap<String, String> postBody = new MultivaluedMapImpl();
postBody.add("X-Username", "admin");
postBody.add("X-Password", "password");
ClientResponse response = webResource.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
.post(ClientResponse.class, postBody);
// check response status code
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
// display response
String output = response.getEntity(String.class);
System.out.println("Output from Server .... ");
System.out.println(output + "\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}
公共类测试{
专用静态字符串baseuri=”http://json/authenticate";
/**
*@param args
*/
公共静态void main(字符串[]args){
试一试{
Client=Client.create();
WebResource=client.resource(baseuri);
MultivaluedMap postBody=新的MultivaluedMapImpl();
添加(“X用户名”、“管理员”);
添加(“X密码”、“密码”);
ClientResponse response=webResource.type(MediaType.APPLICATION\u FORM\u URLENCODED\u type)
.post(ClientResponse.class、postBody);
//检查响应状态代码
if(response.getStatus()!=200){
抛出新的RuntimeException(“失败:HTTP错误代码:”
+response.getStatus());
}
//显示响应
字符串输出=response.getEntity(String.class);
System.out.println(“从服务器输出…”);
System.out.println(输出+“\n”);
}捕获(例外e){
e、 printStackTrace();
}
}
}
当我试图运行这段代码时,我得到了以下错误
java.lang.RuntimeException:失败:HTTP错误代码:415。
请任何人帮我解决这个问题。谢谢。使用url编码的表单类型,我们需要以特定的方式格式化正文。作为国家 控件名称/值按它们在文档中的显示顺序列出。名称与值之间用
=
分隔,名称/值对之间用&
分隔
因此,基本上,数据应该以key1=value2&key2=value2
的形式发送,任何特殊字符都应该进行url编码。在您的情况下,没有特殊字符,所以我们不需要任何编码,只需要格式化。因此,您的客户端请求可能看起来更像
WebResource resource = client.resource(Main.BASE_URI).path("form");
String username = "user";
String password = "pass";
StringBuilder builder = new StringBuilder();
builder.append("X-Username").append("=").append(username).append("&");
builder.append("X-Password").append("=").append(password);
ClientResponse response = resource
.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
.post(ClientResponse.class, builder.toString());
String msg = response.getEntity(String.class);
System.out.println(msg);
response.close();
在服务器端,您需要确保资源接受(@Consumes
)MediaType.APPLICATION\u FORM\u URLENCODED
类型数据,并具有@FormParam
注释以提取值(我们也可以使用多值映射
,但为了便于访问,我们可以使用注释`。因此,您的资源类可能类似于
@Path("/form")
public class FormResource {
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response doForm(@FormParam("X-Username") String username,
@FormParam("X-Password") String password) {
return Response.ok("Good job " + username + "!").build();
}
}
考虑到所有其他基础设施部件都在工作,这应该可以正常工作
注意:如果您确实有任何需要编码的特殊字符,您可以简单地使用
java.net.urlcoder
并使用encode(字符串部分,字符串类型)
从该客户端,您正在将媒体类型设置为媒体类型。应用程序\u表单\u URLENCODED\u类型
。您是否在服务中指定了任何其他媒体类型作为输入?10.4.16 415不支持的媒体类型-服务器拒绝为请求提供服务,因为请求的实体的格式不受请求的r支持E请求的方法的来源。不,我没有指定..您能告诉我我的代码中需要更改什么吗?我将媒体类型更改为“APPLICATION\u JSON\u type”,但出现以下错误“com.sun.jersey.api.client.clienthandler异常:com.sun.jersey.api.client.clienthandler异常:找不到Java类型、类com.sun.jersey.core.util.MultivaluedMapImpl和MIME媒体类型application/json的消息体编写器“我收到此错误APPLICATION\u FORM\u URLENCODED无法解决或不是一个字段我不知道您在哪里使用它,但它应该是MediaType.APPLICATION\u FORM\u URLENCODED
我在客户端请求ClientResponse=resource.type(MediaType.APPLICATION\u FORM\u URLENCODED\type)中使用过类似的内容。post(ClientResponse.class,builder.toString());您也可以简单地使用字符串版本,这是必需的application/x-www-form-urlencoded
。这与使用MediaType.application\u form\urlencoded
相同,但我得到了错误,甚至在服务器端也得到了相同的错误