クエリパラメータとしてListを持つGETサービス用のJerseyクライアントを作成しています。 ドキュメント に従って、Listをクエリパラメータとして使用することができます(この情報は @ QueryParam javadocにもあります)。
一般に、メソッドパラメータのJavaタイプは次のようになります。
- プリミティブ型であること。
- 単一のString引数を受け入れるコンストラクターがあります。
- 単一のString引数を受け入れるvalueOfまたはfromStringという名前の静的メソッドがあります(たとえば、Integer.valueOf(String)およびJava.util.UUID.fromString(String)を参照)。または
- List、Set、またはSortedSetで、Tは上記の2または3を満たします。結果のコレクションは読み取り専用です。
パラメータには、同じ名前の複数の値が含まれることがあります。この場合、4)のタイプを使用してすべての値を取得できます。
ただし、Jerseyクライアントを使用してListクエリパラメーターを追加する方法はわかりません。
代替ソリューションは次のとおりです。
サービスの適切なHTTP動詞はGETであるため、最初のものは良くありません。これはデータ取得操作です。
あなたは私を助けることができない場合、2番目は私のオプションになります。 :)
私もサービスを開発しているので、必要に応じて変更するかもしれません。
ありがとう!
更新
クライアントコード(jsonを使用)
Client client = Client.create();
WebResource webResource = client.resource(uri.toString());
SearchWrapper sw = new SearchWrapper(termo, pagina, ordenacao, hits, SEARCH_VIEW, navegadores);
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
params.add("user", user.toUpperCase());
params.add("searchWrapperAsJSON", (new Gson()).toJson(sw));
ClientResponse clientResponse = webResource .path("/listar")
.queryParams(params)
.header(HttpHeaders.AUTHORIZATION, AuthenticationHelper.getBasicAuthHeader())
.get(ClientResponse.class);
SearchResultWrapper busca = clientResponse.getEntity(new GenericType<SearchResultWrapper>() {});
@GET
は文字列のリストをサポートします
セットアップ:
Java:1.7
ジャージバージョン:1.9
リソース
@Path("/v1/test")
サブリソース:
// receive List of Strings
@GET
@Path("/receiveListOfStrings")
public Response receiveListOfStrings(@QueryParam("list") final List<String> list){
log.info("receieved list of size="+list.size());
return Response.ok().build();
}
ジャージーテストケース
@Test
public void testReceiveListOfStrings() throws Exception {
WebResource webResource = resource();
ClientResponse responseMsg = webResource.path("/v1/test/receiveListOfStrings")
.queryParam("list", "one")
.queryParam("list", "two")
.queryParam("list", "three")
.get(ClientResponse.class);
Assert.assertEquals(200, responseMsg.getStatus());
}
単純な文字列以外を送信する場合は、適切なリクエスト本文でPOSTを使用するか、適切にエンコードされたJSON文字列としてリスト全体を渡すことをお勧めします。ただし、単純な文字列を使用すると、各値をリクエストURLに適切に追加するだけで、Jerseyがそれをデシリアライズします。したがって、次のエンドポイントの例を考えます。
@Path("/service/echo") public class MyServiceImpl {
public MyServiceImpl() {
super();
}
@GET
@Path("/withlist")
@Produces(MediaType.TEXT_PLAIN)
public Response echoInputList(@QueryParam("list") final List<String> inputList) {
return Response.ok(inputList).build();
}
}
クライアントは、次に対応するリクエストを送信します。
GET http://example.com/services/echo?list=Hello&list=Stay&list=Goodbye
これにより、inputList
の値が「Hello」、「Stay」、および「Goodbye」を含むように逆シリアル化されます
上記の代替ソリューションについて同意します
1. Use POST instead of GET;
2. Transform the List into a JSON string and pass it to the service.
また、実装クラスList
には文字列キーと文字列値を受け入れる機能があるため、MultiValuedMap
をMultivaluedMapImpl
に追加できないことは事実です。次の図に示されています
それでも、次のコードを試すよりも、そうしたことをしたいのです。
コントローラークラス
package net.yogesh.test;
import Java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import com.google.gson.Gson;
@Path("test")
public class TestController {
@Path("testMethod")
@GET
@Produces("application/text")
public String save(
@QueryParam("list") List<String> list) {
return new Gson().toJson(list) ;
}
}
クライアントクラス
package net.yogesh.test;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;
import javax.ws.rs.core.MultivaluedMap;
import com.Sun.jersey.api.client.ClientResponse;
import com.Sun.jersey.api.client.WebResource;
import com.Sun.jersey.api.client.config.ClientConfig;
import com.Sun.jersey.api.client.config.DefaultClientConfig;
import com.Sun.jersey.core.util.MultivaluedMapImpl;
public class Client {
public static void main(String[] args) {
String op = doGet("http://localhost:8080/JerseyTest/rest/test/testMethod");
System.out.println(op);
}
private static String doGet(String url){
List<String> list = new ArrayList<String>();
list = Arrays.asList(new String[]{"string1,string2,string3"});
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
String lst = (list.toString()).substring(1, list.toString().length()-1);
params.add("list", lst);
ClientConfig config = new DefaultClientConfig();
com.Sun.jersey.api.client.Client client = com.Sun.jersey.api.client.Client.create(config);
WebResource resource = client.resource(url);
ClientResponse response = resource.queryParams(params).type("application/x-www-form-urlencoded").get(ClientResponse.class);
String en = response.getEntity(String.class);
return en;
}
}
これがお役に立てば幸いです。
JSONクエリパラメータを使用したGETリクエスト
package com.rest.jersey.jerseyclient;
import com.Sun.jersey.api.client.Client;
import com.Sun.jersey.api.client.ClientResponse;
import com.Sun.jersey.api.client.WebResource;
public class JerseyClientGET {
public static void main(String[] args) {
try {
String BASE_URI="http://vaquarkhan.net:8080/khanWeb";
Client client = Client.create();
WebResource webResource = client.resource(BASE_URI);
ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);
/*if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
*/
String output = webResource.path("/msg/sms").queryParam("search","{\"name\":\"vaquar\",\"surname\":\"khan\",\"ext\":\"2020\",\"age\":\"34\""}").get(String.class);
//String output = response.getEntity(String.class);
System.out.println("Output from Server .... \n");
System.out.println(output);
} catch (Exception e) {
e.printStackTrace();
}
}
}
リクエストの投稿:
package com.rest.jersey.jerseyclient;
import com.rest.jersey.dto.KhanDTOInput;
import com.Sun.jersey.api.client.Client;
import com.Sun.jersey.api.client.ClientResponse;
import com.Sun.jersey.api.client.WebResource;
import com.Sun.jersey.api.client.config.ClientConfig;
import com.Sun.jersey.api.client.config.DefaultClientConfig;
import com.Sun.jersey.api.json.JSONConfiguration;
public class JerseyClientPOST {
public static void main(String[] args) {
try {
KhanDTOInput khanDTOInput = new KhanDTOInput("vaquar", "khan", "20", "E", null, "2222", "8308511500");
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
// final HTTPBasicAuthFilter authFilter = new HTTPBasicAuthFilter(username, password);
// client.addFilter(authFilter);
// client.addFilter(new LoggingFilter());
//
WebResource webResource = client
.resource("http://vaquarkhan.net:12221/khanWeb/messages/sms/api/v1/userapi");
ClientResponse response = webResource.accept("application/json")
.type("application/json").put(ClientResponse.class, khanDTOInput);
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code :" + response.getStatus());
}
String output = response.getEntity(String.class);
System.out.println("Server response .... \n");
System.out.println(output);
} catch (Exception e) {
e.printStackTrace();
}
}
}