http - Excepción de tamaño de matriz negativa
post blackberry (6)
Soy nuevo en Blackberry y estoy tratando de publicar un término de búsqueda en un servidor en xml. Pero sigo obteniendo este error Request Failed. Reason Java.lang.NegativeArraySizeException
Request Failed. Reason Java.lang.NegativeArraySizeException
.
Quería comprobar si la conexión funciona antes de analizar los datos por lo que a partir de esta conexión, espero recibir el texto de respuesta en xml. A continuación está el código:
public void webPost(String word) {
word = encode (word);
String responseText;
try{
HttpConnection connection = (HttpConnection)Connector.open("http://some url.xml");
connection.setRequestMethod(HttpConnection.POST);
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
String postData = "username=loginapi&password=myapilogin&term="+ word;
connection.setRequestProperty("Content-Length",Integer.toString(postData.length()));
connection.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0");
OutputStream requestOut = connection.openOutputStream();
requestOut.write(postData.getBytes());
InputStream detailIn = connection.openInputStream();
byte info[]=new byte[(int)connection.getLength()];
detailIn.read(info);
detailIn.close();
requestOut.close();
connection.close();
responseText=new String(info);
requestSuceeded(requestOut.toString(), responseText);
}
catch(Exception ex){
requestFailed(ex.toString());
}
}
private void requestSuceeded(String result, String responseText) {
if(responseText.startsWith("text/xml")) {
String strResult = new String(result);
synchronized(UiApplication.getEventLock()) {
textOutputField.setText(strResult);
}
}
else{
synchronized(UiApplication.getEventLock()) {
Dialog.alert("Unknown content type: " + responseText);
}
}
}
public void requestFailed(final String message) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
Dialog.alert("Request failed. Reason: " + message);
}
});
}
private String encode(String textIn) {
//encode text for http post
textIn = textIn.replace('' '',''+'');
String textout = "";
for(int i=0;i< textIn.length();i++){
char wcai = textIn.charAt(i);
if(!Character.isDigit(wcai) && !Character.isLowerCase(wcai) && !Character.isUpperCase(wcai) && wcai!=''+''){
switch(wcai){
case ''.'':
case ''-'':
case ''*'':
case ''_'':
textout = textout+wcai;
break;
default:
textout = textout+"%"+Integer.toHexString(wcai).toUpperCase();//=textout.concat("%").concat(Integer.toHexString(wcai));
}
}else{
textout = textout+wcai;//=textout.concat(wcai+"");
}
}
return textout;
}
¡Lo encontré! Olvidé abrir la conexión de flujo de salida
requestOut = connection.openOutputStream();
y ByteArrayOutpuStream
que me ayudó a mostrar finalmente el flujo de entrada. También cambié la forma en que estaba enviando los parámetros y, en URLEncodedPostData
lugar, URLEncodedPostData
tipo URLEncodedPostData
. Dado que el servidor estaba interpretando mi solicitud anterior como un GET en lugar de un POST. Y todo lo que tengo que hacer ahora es analizar la información que entra.
try{
connection = (HttpConnection)Connector.open("http://someurl.xml",Connector.READ_WRITE);
URLEncodedPostData postData = new URLEncodedPostData(URLEncodedPostData.DEFAULT_CHARSET, false);
postData.append("username", "loginapi");
postData.append("password", "myapilogin");
postData.append("term", word);
connection.setRequestMethod(HttpConnection.POST);
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0");
requestOut = connection.openOutputStream();
requestOut.write(postData.getBytes());
String contentType = connection.getHeaderField("Content-type");
detailIn = connection.openInputStream();
int length = (int) connection.getLength();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(length > 0){
byte info[] = new byte[length];
int bytesRead = detailIn.read(info);
while(bytesRead > 0) {
baos.write(info, 0, bytesRead);
bytesRead = detailIn.read(info);
}
baos.close();
connection.close();
requestSuceeded(baos.toByteArray(), contentType);
detailIn.read(info);
}
else
{
System.out.println("Negative array size");
}
requestOut.close();
detailIn.close();
connection.close();
}
PD. Publiqué el código anterior para ayudar a cualquier persona con el mismo problema.
PPS. También utilicé el formato de Kalai y me ayudó maravillosamente.
Ref. 1: Blackberry envía una solicitud HTTPPost
Ref2: http://www.blackberryforums.com/developer-forum/181071-http-post-passing-parameters-urls.html
Algo como esto:
URLEncodedPostData postData = new URLEncodedPostData(URLEncodedPostData.DEFAULT_CHARSET, true);
postData.append("name",name);
Supongo que connection.getLength()
devuelve -1 cuando intentas inicializar tu matriz aquí:
byte info[]=new byte[(int)connection.getLength()];
Y esa es la razón de la NegativeArraySizeException.
Supongo que cuando lo haces
byte info[]=new byte[(int)connection.getLength()];
InputStream no conoce su longitud, por lo que devuelve -1.
ver http://www.velocityreviews.com/forums/t143704-inputstream-length.html
java.lang.NegativeArraySizeException indica que está intentando inicializar una matriz con una longitud negativa.
El único código que se inicializa es -
byte info[]=new byte[(int)connection.getLength()];
Es posible que desee agregar un cheque de longitud antes de inicializar la matriz
connection.getLength () está devolviendo -1 .
Antes de crear la matriz de información, verifique la duración de la conexión.
int length = (int) connection.getLength();
if(length > 0){
byte info[]=new byte[length];
// perform operations
}else{
System.out.println("Negative array size");
}