Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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
Java 如何使用Jesrey发布表单数据?_Java_Rest_Jersey - Fatal编程技术网

Java 如何使用Jesrey发布表单数据?

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

我是新泽西人。我试图使用jersey call发布两个表单数据。以下是我的代码

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
相同,但我得到了错误,甚至在服务器端也得到了相同的错误