2014-12-18 3 views
2

новичок в jersey.Am выкладывает две данные формы джерси call.The следующего мой код,Как отправить данные формы с помощью 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(); 
     } 

    } 

} 

Пока я пытаюсь запустить этот код, я получаю следующую ошибку

Java .lang.RuntimeException: Ошибка: код ошибки HTTP: 415.

Пожалуйста, помогите мне с этим. Спасибо.

+0

От этого клиента, вы устанавливаете тип носителя как '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 и использовать encode(String part, String encType)

+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