Ich erstelle einen Jersey-Client für einen GET-Dienst, der eine Liste als Abfrageparameter enthält. Laut Dokumentation ist es möglich, eine Liste als Abfrageparameter zu haben (diese Information befindet sich auch unter @ QueryParam javadoc), check it out:
Im Allgemeinen kann der Typ Java des Methodenparameters:
- Sei ein primitiver Typ;
- Haben Sie einen Konstruktor, der ein einzelnes String-Argument akzeptiert;
- Haben Sie eine statische Methode mit dem Namen valueOf oder fromString, die ein einzelnes String-Argument akzeptiert (siehe z. B. Integer.valueOf (String) und Java.util.UUID.fromString (String)). oder
- Seien Sie List, Set oder SortedSet, wobei T 2 oder 3 oben erfüllt. Die resultierende Sammlung ist schreibgeschützt.
Manchmal können Parameter mehr als einen Wert für denselben Namen enthalten. Ist dies der Fall, können mit 4) alle Werte ermittelt werden.
Ich kann jedoch nicht herausfinden, wie ein List-Abfrageparameter mit dem Jersey-Client hinzugefügt wird.
Ich verstehe alternative Lösungen sind:
Das erste ist nicht gut, da das richtige HTTP-Verb für den Dienst GET ist. Es ist eine Datenabrufoperation.
Der zweite ist meine Option, wenn Sie mir nicht helfen können. :)
Ich entwickle auch den Dienst, damit ich ihn nach Bedarf ändern kann.
Vielen Dank!
Update
Client Code (mit 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
unterstützt List of Strings
Setup:
Java: 1.7
Jersey-Version: 1.9
Ressource
@Path("/v1/test")
Subressource:
// 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();
}
Jersey-Testfall
@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());
}
Wenn Sie etwas anderes als einfache Zeichenfolgen senden, empfehle ich die Verwendung eines POST mit einem entsprechenden Anforderungshauptteil oder die Übergabe der gesamten Liste als entsprechend codierte JSON-Zeichenfolge. Bei einfachen Zeichenfolgen ist dies jedoch nur erforderlich Um jeden Wert entsprechend an die Anforderungs-URL anzuhängen, deserialisiert Jersey ihn für Sie.
@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();
}
}
Ihr Kunde würde eine Anfrage senden, die folgenden Kriterien entspricht:
GET http://example.com/services/echo?list=Hello&list=Stay&list=Goodbye
Dies würde dazu führen, dass inputList
deserialisiert wird und die Werte 'Hello', 'Stay' und 'Goodbye' enthält.
ich stimme mit Ihnen über alternative Lösungen überein, die Sie oben erwähnt haben
1. Use POST instead of GET;
2. Transform the List into a JSON string and pass it to the service.
und es ist wahr, dass Sie List
nicht zu MultiValuedMap
hinzufügen können, da die impl-Klasse MultivaluedMapImpl
String Key und String Value akzeptieren kann. Das ist in der folgenden Abbildung dargestellt
dennoch möchten Sie diese Dinge tun, als folgenden Code zu versuchen.
Controller-Klasse
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) ;
}
}
Client-Klasse
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;
}
}
hoffe das wird dir helfen.
GET Request with JSON Query Param
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();
}
}
}
Post-Anfrage:
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();
}
}
}