Объект ответа возвращается клиенту в ответ на запрос, отправленный на сервер. Класс Response имеет внутренний класс Response.ResponseBuilder, который собирает все свойства, заданные в его поле типа Response.ResponseBuilder. Response.ResponseBuilder применяет шаблон проектирования Builder для построения объекта ответа.
Метод build () отвечает за подключение цепочки объектов Response.ResponseBuilder, сформированных в ходе сборки. Например,
Response.status(200);
возвращает метод ответа Response.ResponseBuilder после назначения объекта объекта STATUS
Response.status(200).entity( AnyObj );
объекта присваивается сущности (возвращаемая обратная связь) типа Response.ResponseBuilder и присваивается экземпляр Response. После этого статус также присваивает статус и возвращает экземпляр Response.ResponseBuilder. Строитель соединяет их во время вызова метода build ().
Response.status(200).entity( obj ).build();
Наконец, метод построения конструируется полностью (со свойствами, указанными) Response.
Теперь возникает вопрос о Объект GenericEntity. Он представляет объект ответа общего типа T.
Для экземпляра,
GenericEntity> obj = new GenericEntity> (lst) {}; Response.status (200) .entity (obj) .build ();
obj - тип списка, как указано выше. метод entity принимает тип объекта, который является общим. Если возникнет необходимость в конкретном типе, вы должны передать его в качестве аргумента типа GenericEntity, с помощью которого во время выполнения он передается объекту определенного типа.
Практическое использование
Требуется для my Jersey Framework для ответа JSON типа Array, который был объектом List в моей модели Java, возвращался к клиенту как часть объекта Response.
Поэтому новый GenericEntity> --- передает объект / полезную нагрузку в тип списка new GenericEntity --- тип выполнения становится String
Ресурс на стороне Webservice
public Response findAllFruits(@QueryParam("frtID") String frtID ) {
List<String> lst = new ArrayList<String>();
lst.add("Banana");
lst.add("Apple");
GenericEntity<List<String>> obj = new GenericEntity<List<String>>(lst) {};
return Response.status(200).entity( obj ).build();
}
Выходной ответ отправляется обратно клиенту. [«Банан», «Яблоко»]
Как читать объект ответа
List<CustomType> myObj= response.readEntity(new GenericType<List<CustomType>>() {});
Нет, нет «чистого» способа сделать это.
Тип array
- это примитивный тип . Объекты, реализующие интерфейс ArrayAccess
, основаны на классах, также известных как композитный тип . Нет никакого типа-намека, который охватывает оба.
Поскольку вы используете ArrayAccess
в качестве массива, вы можете просто его бросить. Например:
$config = new Config;
$lol = new I_Use_A_Config( (array) $config);
Если это не опция (вы хотите использовать объект Config
как есть), просто удалите подсказку типа и проверьте, что это либо массив, либо ArrayAccess
. Я знаю, что вы хотели этого избежать, но это не очень важно. Это всего лишь несколько строк и, когда все сказано и сделано, несущественны.
Ну php поддерживает Type hinting для Array / Object. Поэтому массив должен работать нормально. Однако передача объекта ArrayAccess по методу, разрешенному только для типа массива, может вызывать ошибки. ArrayAccess используется в основном для целей итерации объекта ArrayAccess так же, как массив, как использование в foreach.
У них есть реальное решение в PHP 7.1.
http://php.net/manual/en/migration71.new-features.php#migration71.new-features.iterable- псевдо-тип
Итерируемый псевдотип - это то, что вы хотите. Любой массив или тип Traversable (который является базовым интерфейсом для итераторов) проведет эту проверку.
Теперь, чтобы сделать это понятным для всех, кто хочет получить супер-глубину, да, быть краевыми случаями. Вы должны думать об этих крайних случаях и решать их самостоятельно, но если вы хотите убедиться, что если кто-то проходит через проходящий элемент, к которому нельзя получить доступ через ключ, вы можете это сделать.
http://php.net/manual/en/function.iterator-to-array.php
Теперь, независимо от того, что они передают в подсказке типа, у вас будет массив , но это может устранить преимущества использования генератора для уменьшения памяти. Это должно быть очевидно, но, видимо, это не так, так вот. Вы, программист, несете ответственность за выяснение своих конкретных случаев использования кода и того, как вы планируете его использовать, и для чего подходит код использования.
Поскольку это еще недостаточно ясно , скажем, вы пытаетесь передать что-то, что является типом, и ожидаете существования определенного метода или переменной, тогда вы плохо программируете. Вы должны выполнить контракт, у которого есть тип возвращаемого значения, который вы ищете, и передать его, а не общий тип. Если вы хотите сделать что-то общее, например, цикл, для чего нужны итерируемые типы. Подсказка в названии: Iterate.
key
.
– Michael Ryan Soileau
5 April 2017 в 00:13
array
или ArrayAccess
), но, безусловно, не является предполагаемым ответом, потому что это позволяет больше. То же самое касается iterable
. 2) Осторожно - подсказка типа iterable
означает array
или Traversable
, а не Iterator
. Например, Generator
- Traversable
, но с помощью ключа невозможно получить доступ к значениям. И если вы посмотрите на пример - намерение состоит в том, чтобы указать объявление типа для конфигураций, где доступ через ключ, вероятно, является ожидаемой способностью данного параметра.
– mancze
5 April 2017 в 08:40
Iterator
невозможно получить через ключ. Метод key
просто возвращает ключ текущей позиции указателя. Вы не можете сделать $iterator['user']
.
– mancze
5 April 2017 в 08:42