如何使用Jersey发布表单数据?

时间:2014-12-18 05:18:11

标签: java rest jersey

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

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

    }

}

在尝试运行此代码时,我收到以下错误

java.lang.RuntimeException:失败:HTTP错误代码:415。

请任何人帮助我......谢谢。

1 个答案:

答案 0 :(得分:1)

使用url编码的表单类型,我们需要以特定的方式格式化主体。作为州here

  

控件名称/值按它们在文档中出现的顺序列出。该名称与值=分隔开来,名称/值对由&分隔开来。

所以基本上,数据应该以{{1​​}}的形式发送,任何特殊字符都应该是url编码的。在您的情况下,没有特殊字符,因此我们不需要任何编码,只需格式化。因此,您的客户请求可能看起来更像

key1=value2&key2=value2

在服务器端,您需要确保资源也接受(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_FORM_URLENCODED个注释来提取值(我们也可以@FormParam,但是为了便于访问,我们可以使用注释。所以你的资源类可能看起来像

MultivalueMap

如果所有其他基础设施部件都正常工作,这应该可以正常工作。

注意:如果你有任何需要编码的特殊字符,你可以简单地使用@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.URLEncoder