Может ли пользовательский тип контента содержать @ ? Спокойный звонок с трикотажным клиентом

Попытка вызвать службу restful, которая принимает только application/[email protected] в качестве типа контента, и служба также возвращает свою полезную нагрузку (двоичный поток) с этим типом контента.

Я использую клиент из трикотажа для совершения звонка, я получил следующую ошибку, означает ли это, что клиент из трикотажа не поддерживает какой-либо тип контента с @ внутри?

Спасибо

Причина: java.lang.IllegalArgumentException: ошибка синтаксического анализа типа мультимедиа «application/[email protected]» на org.glassfish.jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:92) на org.glassfish. jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:60)     на javax.ws.rs.core.MediaType.valueOf(MediaType.java:179)     на org.glassfish.jersey.message.internal.InboundMessageContext$5.apply (InboundMessageContext.java:446)     ... еще 48 Причина: java.text.ParseException: ожидаемый разделитель ';' вместо '@'     в org.glassfish.jersey.message.internal.HttpHeaderReader.nextSeparator(HttpHeaderReader.java:115)     в org.glassfish.jersey.message.internal.HttpHeaderReader.readParameters(HttpHeaderReader.java:249)     в org. Glassfish.jersey.message.internal.HttpHeaderReader.readParameters(HttpHeaderReader.java:242)     на org.glassfish.jersey.message.internal.MediaTypeProvider.valueOf(MediaTypeProvider.java:110)     на org.glassfish.jersey.message.internal. MediaTypeProvider.fromString(MediaTypeProvider.java:90)


person user3697919    schedule 23.04.2015    source источник


Ответы (1)


См. спецификации типов носителей и процедуры регистрации: 4.2. Требования к именованию

Имена типов и подтипов ДОЛЖНЫ соответствовать следующему ABNF:

 type-name = reg-name
 subtype-name = reg-name

 reg-name = 1*127reg-name-chars
 reg-name-chars = ALPHA / DIGIT / "!" /
                   "#" / "$" / "&" / "." /
                   "+" / "-" / "^" / "_"`

@ не является одним из допустимых символов. Вы могли бы так "application/xxx!#$&.+-^_1.0" и это сработало бы.

Поток к исключению:

  • GrammarUtil поддерживает список SEPARATORS

    private static final char[] SEPARATORS =
        {'(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', 
         '/', '[', ']', '?', '=', '{', '}', ' ', '\t'};
    

    Наряду с этим списком есть списки другого типа, чтобы дополнить список возможных символов. Единственные символы, которые фактически используются в процессе, — это символы / и ;, которые являются разделителями для типов мультимедиа, например. application/json;charset=utf-8

  • первый разделитель установлен на /. Целью обработки строки типа мультимедиа является получение экземпляра MediaType с построением типа MediaType(type, subType, params), где type — это application, subType — это json, а params — это Map, включая charset=utf-8.

  • Символы перебираются до тех пор, пока не встретится первый разделитель /, где nextSeparator('/'). Это нормально, поскольку они совпадают, как и ожидалось. Но когда достигается следующий символ-разделитель @, вызывается nextSepartor(';'), как и ожидаемый следующий разделитель. A ParseException выбрасывается

    if (c != getEventValue().charAt(0)) {
        throw new ParseException("Expected separator '" + c + "' instead of '"
                + getEventValue().charAt(0) + "'", getIndex());
    
person Paul Samsotha    schedule 23.04.2015