Java PostMethod con XML
-
27-10-2019 - |
Domanda
Sto cercando di dati post XML come un corpo ad un'API REST.
Ho un metodo che crea la richiesta di chiamata Dorest.
String url = null;
HttpMethod method;
LOG.info("QUERY: " + query);
if (StringUtil.isEmpty(query)) {
url = BuildRequestURL("/issues.ashx/issues/mywork");
method = doREST(url, false);
} else {
url = BuildRequestURL("/issues.ashx/issues/filters");
//method = doREST(url, true);
method = doREST(url, true);
String xml = "<IssuesFilterEN>" +
"<IssueID>" + query + "</IssueID>" +
"</IssuesFilterEN>";
RequestEntity entity = new StringRequestEntity(xml,"text/xml; charset=iso-8859-1", null);
method.setRequestEntity(entity);
}
e il metodo Dorest
private HttpMethod doREST(String request, boolean post) throws Exception {
String uri = request;
HttpMethod method = post ? new PostMethod(uri) : new GetMethod(uri);
configureHttpMethod(method);
HttpClient client = getHttpClient();
client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, timeoutLength);
client.executeMethod(method);
return method;
}
Il mio problema è il method.setRequestEntity sta dicendo che il metodo non è stato trovato.
ho
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.*;
Se i metodo set = PostMethod invece di method = Dorest funziona, ma io non voglio avere a che fare in tutti i miei altri metodi solo per creare query.
C'è qualcosa che mi manca sul motivo per cui il method.setRequestEntity non funziona il modo in cui è adesso?
EDIT: Ho ottenuto il mio informazioni per l'utilizzo di setRequestEntity da PostMethod setRequestBody (String) deprecato - perché
EDIT 2: Ecco quello che ho finito per fare.
private HttpMethod doREST(String request, RequestEntity entity) throws Exception {
String uri = request;
HttpMethod method;
if ( entity != null ){
method = new PostMethod(uri);
((PostMethod) method).setRequestEntity(entity);
} else {
method = new GetMethod(uri);
}
configureHttpMethod(method);
HttpClient client = getHttpClient();
client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, timeoutLength);
client.executeMethod(method);
return method;
}
Soluzione
Si dovrebbero modificare doREST
ad accettare la RequestEntity
invece di un boolean
. Passare in null
per un GET e un valore per POST. Utilizzare che come il controllo per vedere se avete bisogno di un PostMethod
o un GetMethod
. Allora si può avere il tipo specifico in modo da poter chiamare il PostMethod
solo setRequestEntity()
.
EDIT:
È possibile evitare il cast in questo modo:
private HttpMethod doREST(String request, RequestEntity entity) throws Exception {
String uri = request;
HttpMethod method;
if ( entity != null ){
PostMethod postMethod = new PostMethod(uri);
postMethod.setRequestEntity(entity);
method = postMethod;
} else {
method = new GetMethod(uri);
}
configureHttpMethod(method);
HttpClient client = getHttpClient();
client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, timeoutLength);
client.executeMethod(method);
return method;
}
Altri suggerimenti
Il metodo si dovrebbe essere chiamato è setEntity
, non setRequestEntity
. Inoltre, il tuo corpo deve essere avvolto in un StringEntity
, non un StringRequestEntity
, importato da org.apache.http.entity
.