2014-12-18 4 views
2

나는 다음과 같은 오류를Jesrey를 사용하여 양식 데이터를 게시하는 방법은 무엇입니까?

자바를 얻을

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

    } 

} 

동안이 코드를 실행하기 위해 노력하고, jersey.Am 새로운 기능은 다음 저지 call.The을 사용하여 두 폼 데이터 내 코드가 게시하려고 .lang.RuntimeException : 실패 : HTTP 오류 코드 : 415.

제발 이것 좀 도와주세요. 고마워요.

+0

encode(String part, String encType)을 사용할 수 있습니다, 당신은 MediaType.APPLICATION_FORM_URLENCODED_TYPE''로 용지 종류를 설정합니다. 다른 미디어 유형을 서비스의 입력으로 지정 했습니까? –

+0

** 10.4.16 415 지원되지 않는 미디어 유형 ** - 요청의 엔터티가 요청 된 방법에 대해 요청 된 리소스에서 지원하지 않는 형식이기 때문에 서버가 요청 서비스를 거부합니다. [HTTP/1.1 : 상태 코드 정의] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) –

+0

아니요. 코드를 변경해야하는 이유를 알려주세요. ? – Ninja

답변

1

URL 인코딩 형식 유형을 사용하여 특정 방식으로 본문을 포맷해야합니다. 상태로 here

제어 이름/값은 문서에 표시된 순서대로 나열됩니다. 이름은 =의 값과 분리되며 이름/값 쌍은 &으로 서로 구분됩니다.

기본적으로 데이터는 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_FORM_URLENCODED 유형의 데이터를 받아, 그 값을 추출하는 @FormParam 주석이 있는지 확인해야합니다 MultivalueMap,하지만 쉽게 액세스, 우리는 annotation`를 사용할 수 있습니다. 자원 클래스는

@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의 간단한 메이크업의 사용이 클라이언트에서

+0

이 오류가 발생했습니다. APPLICATION_FORM_URLENCODED를 (를) 해결할 수 없거나 필드가 아닙니다. – Ninja

+0

이 위치를 사용하고 있는지, 하지만 MediaType.APPLICATION_FORM_URLENCODED' –

+0

내가 내 클라이언트 요청 ClientResponse 응답에 다음과 같이 사용했다'해야 = resource.type (MediaType.APPLICATION_FORM_URLENCODED_TYPE) \t \t .post (ClientResponse.class, builder.toString()); – Ninja

관련 문제