title: BlackBerry OS 5 - 7 - Trying to get JSON response and get error code 500
body: <p>I have been trying to get the json response from  my company's json webservice. Here is the code:</p>
  
  <pre><code>public final static String GOINOUT_HOST_NAME = "http://ec2-54-254-123-244.ap-southeast-1.compute.amazonaws.com";
  public final static String GOINOUT_API_VERSION = "/api/v1";
  
  public final static String GOINOUT_FACEBOOK_AUTHENTICATE = GOINOUT_HOST_NAME + GOINOUT_API_VERSION + "/facebook_authenticate";
  
  public static JSONObject loginGoinoutWithFacebook(String accessToken) {
      JSONObject goinoutUserJsonObject = null;
      try {
          Hashtable params = new Hashtable();
          params.put("access_token", accessToken);
          String paramsString = StringUtil.toURLParameters(params);
  
          Hashtable properties = new Hashtable();
          String response = HttpUtils.sendGoinoutJsonRequest(GOINOUT_FACEBOOK_AUTHENTICATE + "?" + paramsString, paramsString, HttpUtils.TIMEOUT, properties, HttpConnection.POST);
          Dialog.alert("res: " + response);
          JSONObject goinoutJsonObject = new JSONObject(response);
          goinoutUserJsonObject = new JSONObject(goinoutJsonObject.getString("user"));
      } catch (IOException e) {
          Dialog.alert("e1: " + e.getMessage());
          e.printStackTrace();
      } catch (JSONException e1) {
          Dialog.alert("e2: " + e1.getMessage());
          e1.printStackTrace();
      }
      return goinoutUserJsonObject;
  }
  </code></pre>
  
  <p>And this following chunk of code is the goinout json request:</p>
  
  <pre><code>public static String sendGoinoutJsonRequest(String url,String data,long timeout, Hashtable properties, String method) throws IOException {
  
      HttpConnectionFactory factory = new HttpConnectionFactory(Util.getTransportPriority());
      while(true) {
  
          HttpConnectionIOSession httpConnectionIOSession = null;
          try {
  
              HttpConnection httpConnection = factory.getHttpConnection(url);
              if(httpConnection == null) throw new IOException();
              try {
  
                  httpConnection.setRequestMethod(method);
                  httpConnection.setRequestProperty("If-Modified-Since","29 Oct 1999 19:43:31 GMT");
                  httpConnection.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0");
                  httpConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
                  httpConnection.setRequestProperty("Accept","application/json");                    
                  httpConnection.setRequestProperty("Content-Length",data.getBytes().length + "");
                  httpConnection.setRequestProperty("Content-Language","en-US");
                  httpConnection.setRequestProperty("x-rim-transcode-content","none");
                  Enumeration keys = properties.keys();
                  while(keys.hasMoreElements()) {
                      String key = (String) keys.nextElement();
                      String value = (String) properties.get(key);
                      httpConnection.setRequestProperty(key, value);
                  }
                  OutputStream outputStream = httpConnection.openOutputStream();
                  InputStream inputStream = null;
                  if(timeout != -1) {
  
                      httpConnectionIOSession = new HttpConnectionIOSession(httpConnection,inputStream,outputStream,timeout);
  
                  }
                  outputStream.write(data.getBytes());
                  outputStream.close();
                  int responseCode = httpConnection.getResponseCode();
                  if(responseCode != HttpConnection.HTTP_OK) {
  
                      if(responseCode == HttpConnection.HTTP_BAD_REQUEST) {
  
                          continue;
  
                      }
                      if(timeout != -1 &amp;&amp; HttpUtils.TIMEOUT + 2000 &lt;= TIMEOUT_MIN) {
  
                          HttpUtils.TIMEOUT += 2000;
  
                      }
                      throw new IOException("HTTP " + responseCode + " error code.");
  
                  }
                  inputStream = httpConnection.openInputStream();
                  final ByteBuffer byteBuffer = new ByteBuffer(inputStream);
                  final String response = byteBuffer.getString();
                  close(httpConnection,inputStream,outputStream);
  
                  if(timeout != -1 &amp;&amp; HttpUtils.TIMEOUT - 1000 &gt;= TIMEOUT_MIN) {
  
                      HttpUtils.TIMEOUT -= 1000;
  
                  }
                  if(httpConnectionIOSession != null) httpConnectionIOSession.interrupt();
                  return response;
  
              } catch(IOException ioException) {
  
                  if(timeout != -1 &amp;&amp; HttpUtils.TIMEOUT + 2000 &lt;= TIMEOUT_MIN) {
  
                      HttpUtils.TIMEOUT += 2000;
  
                  }
                  throw ioException;
  
  
              }
  
          } catch(IOException ioException) {
  
              if(timeout != -1 &amp;&amp; HttpUtils.TIMEOUT + 2000 &lt;= TIMEOUT_MIN) {
  
                  HttpUtils.TIMEOUT += 2000;
  
              }
              throw ioException;
  
          } finally {
              if(httpConnectionIOSession != null) httpConnectionIOSession.interrupt();
          }
  
      }
  
  }
  </code></pre>
  
  <p>Look at the properties that I set. If I use this following of properties:</p>
  
  <pre><code>httpConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
  httpConnection.setRequestProperty("Accept","application/json");
  </code></pre>
  
  <p>what happens is that I could retrieve the JSON data from my BB simulator, and from my real device using wifi connection. BUT, when I use REAL DEVICE using Mobile Service Provider, I will always get IOException: stream closed.</p>
  
  <p>If I use this following code:</p>
  
  <pre><code>httpConnection.setRequestProperty("Content-Type","application/json");
  httpConnection.setRequestProperty("Accept","application/json");   
  </code></pre>
  
  <p>I always get HTTP Error Code 500 in simulator. And if I use this property in the real device using mobile service provider, the code is keep running because of while(true) there. I wonder if you guys could help me out.</p>
  
  <p>As a matter of fact, This chunk of code is proven work in obtaining json data from Facebook API and Tumblr API. I always use this code and has no problem. I wonder if it could be something wrong with the server side, or I should add another property??? Thank you so much.</p>
  
  <p>Nate request for HttpConnectionFactory:</p>
  
  <pre><code>package com.hammyliem.abateify.ui.network;
  
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.Vector;
  
  import javax.microedition.io.Connector;
  import javax.microedition.io.HttpConnection;
  
  import net.rim.device.api.io.http.HttpHeaders;
  import net.rim.device.api.io.http.HttpProtocolConstants;
  import net.rim.device.api.servicebook.ServiceBook;
  import net.rim.device.api.servicebook.ServiceRecord;
  import net.rim.device.api.system.Branding;
  import net.rim.device.api.system.CoverageInfo;
  import net.rim.device.api.system.DeviceInfo;
  import net.rim.device.api.system.WLANInfo;
  
  public class HttpConnectionFactory {
  
    public static final int TRANSPORT_WIFI = 1;
    public static final int TRANSPORT_BES = 2;
    public static final int TRANSPORT_BIS = 4;
    public static final int TRANSPORT_DIRECT_TCP = 8;
    public static final int TRANSPORT_WAP2 = 16;
    public static final int TRANSPORT_SIM = 32;
  
    public static final int TRANSPORTS_ANY = TRANSPORT_WIFI | TRANSPORT_BES | TRANSPORT_BIS | TRANSPORT_DIRECT_TCP | TRANSPORT_WAP2 | TRANSPORT_SIM;
    public static final int TRANSPORTS_AVOID_CARRIER = TRANSPORT_WIFI | TRANSPORT_BES | TRANSPORT_BIS | TRANSPORT_SIM;
    public static final int TRANSPORTS_CARRIER_ONLY = TRANSPORT_DIRECT_TCP | TRANSPORT_WAP2 | TRANSPORT_SIM;
  
    public static final int DEFAULT_TRANSPORT_ORDER[] = { TRANSPORT_WIFI, TRANSPORT_SIM, TRANSPORT_BIS, TRANSPORT_BES, TRANSPORT_WAP2, TRANSPORT_DIRECT_TCP };
  
    private static final int TRANSPORT_COUNT = DEFAULT_TRANSPORT_ORDER.length;
  
    // private static ServiceRecord srMDS[], srBIS[], srWAP2[], srWiFi[];
    private static ServiceRecord srWAP2[];
    private static boolean serviceRecordsLoaded = false;
  
    private int transports[];
    private int lastTransport = -1;
  
    public HttpConnectionFactory() {
      this(0);
    }
  
    public HttpConnectionFactory(int allowedTransports) {
      this(transportMaskToArray(allowedTransports));
    }
  
    public HttpConnectionFactory(int transportPriority[]) {
      if (!serviceRecordsLoaded) {
        loadServiceBooks(false);
      }
      transports = transportPriority;
    }
  
    public static String getUserAgent() {
      StringBuffer sb = new StringBuffer();
      sb.append("BlackBerry");
      sb.append(DeviceInfo.getDeviceName());
      sb.append("/");
      sb.append(DeviceInfo.getSoftwareVersion());
      sb.append(" Profile/");
      sb.append(System.getProperty("microedition.profiles"));
      sb.append(" Configuration/");
      sb.append(System.getProperty("microedition.configuration"));
      sb.append(" VendorID/");
      sb.append(Branding.getVendorId());
  
      return sb.toString();
    }
  
    public static String getProfile() {
      StringBuffer sb = new StringBuffer();
      sb.append("http://www.blackberry.net/go/mobile/profiles/uaprof/");
      sb.append(DeviceInfo.getDeviceName());
      sb.append("/");
      sb.append(DeviceInfo.getSoftwareVersion().substring(0, 3)); //RDF file format is 4.5.0.rdf (does not include build version)
      sb.append(".rdf");
  
      return sb.toString();
    }
  
    public HttpConnection getHttpConnection(String pURL) {
      return getHttpConnection(pURL, null, null);
    }
  
    public HttpConnection getHttpConnection(String pURL, HttpHeaders headers) {
      return getHttpConnection(pURL, headers, null);
    }
  
    public HttpConnection getHttpConnection(String pURL, byte[] data) {
      return getHttpConnection(pURL, null, data);
    }
  
    public HttpConnection getHttpConnection(String pURL, HttpHeaders headers, byte[] data) {
  
      int curIndex = 0;
      HttpConnection con = null;
  
      while ((con = tryHttpConnection(pURL, curIndex, headers, data)) == null) {
        try {
          curIndex = nextTransport(curIndex);
        } catch (HttpConnectionFactoryException e) {
          e.printStackTrace();
          break;
        } finally {
        }
      }
  
      if (con != null) {
        setLastTransport(transports[curIndex]);
      }
  
      return con;
    }
  
    private int nextTransport(int curIndex) throws HttpConnectionFactoryException {
      if ((curIndex &gt;= 0) &amp;&amp; (curIndex &lt; transports.length - 1)) {
        return curIndex + 1;
      } else {
        throw new HttpConnectionFactoryException("No more transport available.");
      }
    }
  
    private HttpConnection tryHttpConnection(String pURL, int tIndex, HttpHeaders headers, byte[] data) {
  
      HttpConnection con = null;
      OutputStream os = null;
  
      switch (transports[tIndex]) {
      case TRANSPORT_SIM:
        try {
          con = getSimConnection(pURL, false);
        } catch (IOException e) {
        } finally {
          break;
        }
      case TRANSPORT_WIFI:
        try {
          con = getWifiConnection(pURL);
        } catch (IOException e) {
        } finally {
          break;
        }
      case TRANSPORT_BES:
        try {
          con = getBesConnection(pURL);
        } catch (IOException e) {
        } finally {
          break;
        }
      case TRANSPORT_BIS:
        try {
          con = getBisConnection(pURL);
        } catch (IOException e) {
        } finally {
          break;
        }
      case TRANSPORT_DIRECT_TCP:
        try {
          con = getTcpConnection(pURL);
        } catch (IOException e) {
        } finally {
          break;
        }
      case TRANSPORT_WAP2:
        try {
          con = getWap2Connection(pURL);
        } catch (IOException e) {
        } finally {
          break;
        }
      }
  
      if (con != null) {
        try {
          //add headers to connection
          if (headers != null) {
            int size = headers.size();
  
            for (int i = 0; i &lt; size;) {
              String header = headers.getPropertyKey(i);
              String value = headers.getPropertyValue(i++);
  
              if (value != null) {
                con.setRequestProperty(header, value);
  
              }
            }
          }
          // post data
          if (data != null) {
            con.setRequestMethod(HttpConnection.POST);
            con.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_TYPE, HttpProtocolConstants.CONTENT_TYPE_APPLICATION_X_WWW_FORM_URLENCODED);
            con.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(data.length));
  
            os = con.openOutputStream();
            os.write(data);
          } else {
            con.setRequestMethod(HttpConnection.GET);
          }
  
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
  
      return con;
    }
  
    public int getLastTransport() {
      return lastTransport;
    }
  
    public String getLastTransportName() {
      return getTransportName(getLastTransport());
    }
  
    private void setLastTransport(int pLastTransport) {
      lastTransport = pLastTransport;
    }
  
    private HttpConnection getSimConnection(String pURL, boolean mdsSimulatorRunning) throws IOException {
      if (DeviceInfo.isSimulator()) {
        if (mdsSimulatorRunning) {
          return getConnection(pURL, ";deviceside=false", null);
        } else {
          return getConnection(pURL, ";deviceside=true", null);
        }
      }
      return null;
    }
  
    private HttpConnection getBisConnection(String pURL) throws IOException {
      if (CoverageInfo.isCoverageSufficient(4 /* CoverageInfo.COVERAGE_BIS_B */)) {
        return getConnection(pURL, ";deviceside=false;ConnectionType=mds-public", null);
      }
      return null;
    }
  
    private HttpConnection getBesConnection(String pURL) throws IOException {
      if (CoverageInfo.isCoverageSufficient(2 /* CoverageInfo.COVERAGE_MDS */)) {
        return getConnection(pURL, ";deviceside=false", null);
      }
      return null;
    }
  
    private HttpConnection getWifiConnection(String pURL) throws IOException {
      if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) {
        return getConnection(pURL, ";interface=wifi", null);
      }
      return null;
    }
  
    private HttpConnection getWap2Connection(String pURL) throws IOException {
      if (CoverageInfo.isCoverageSufficient(1 /* CoverageInfo.COVERAGE_DIRECT */) &amp;&amp; (srWAP2 != null) &amp;&amp; (srWAP2.length != 0)) {
        return getConnection(pURL, ";deviceside=true;ConnectionUID=", srWAP2[0].getUid());
      }
      return null;
    }
  
    private HttpConnection getTcpConnection(String pURL) throws IOException {
      if (CoverageInfo.isCoverageSufficient(1 /* CoverageInfo.COVERAGE_DIRECT */)) {
        return getConnection(pURL, ";deviceside=true", null);
      }
      return null;
    }
  
    private HttpConnection getConnection(String pURL, String transportExtras1, String transportExtras2) throws IOException {
      StringBuffer fullUrl = new StringBuffer();
      fullUrl.append(pURL);
      if (transportExtras1 != null) {
        fullUrl.append(transportExtras1);
      }
      if (transportExtras2 != null) {
        fullUrl.append(transportExtras2);
      }
      return (HttpConnection) Connector.open(fullUrl.toString());
    }
  
    public static void reloadServiceBooks() {
      loadServiceBooks(true);
    }
  
    private static synchronized void loadServiceBooks(boolean reload) {
      if (serviceRecordsLoaded &amp;&amp; !reload) {
        return;
      }
      ServiceBook sb = ServiceBook.getSB();
      ServiceRecord[] records = sb.getRecords();
      Vector mdsVec = new Vector();
      Vector bisVec = new Vector();
      Vector wap2Vec = new Vector();
      Vector wifiVec = new Vector();
  
      if (!serviceRecordsLoaded) {
        for (int i = 0; i &lt; records.length; i++) {
          ServiceRecord myRecord = records[i];
          String cid, uid;
  
          if (myRecord.isValid() &amp;&amp; !myRecord.isDisabled()) {
            cid = myRecord.getCid().toLowerCase();
            uid = myRecord.getUid().toLowerCase();
            if ((cid.indexOf("wptcp") != -1) &amp;&amp; (uid.indexOf("wap2") != -1) &amp;&amp; (uid.indexOf("wifi") == -1) &amp;&amp; (uid.indexOf("mms") == -1)) {
              wap2Vec.addElement(myRecord);
            }
          }
        }
  
        srWAP2 = new ServiceRecord[wap2Vec.size()];
        wap2Vec.copyInto(srWAP2);
        wap2Vec.removeAllElements();
        wap2Vec = null;
  
        serviceRecordsLoaded = true;
      }
    }
  
    public static int[] transportMaskToArray(int mask) {
      if (mask == 0) {
        mask = TRANSPORTS_ANY;
      }
      int numTransports = 0;
      for (int i = 0; i &lt; TRANSPORT_COUNT; i++) {
        if ((DEFAULT_TRANSPORT_ORDER[i] &amp; mask) != 0) {
          numTransports++;
        }
      }
      int transports[] = new int[numTransports];
      int index = 0;
      for (int i = 0; i &lt; TRANSPORT_COUNT; i++) {
        if ((DEFAULT_TRANSPORT_ORDER[i] &amp; mask) != 0) {
          transports[index++] = DEFAULT_TRANSPORT_ORDER[i];
        }
      }
      return transports;
    }
  
    private static String getTransportName(int transport) {
      String tName;
      switch (transport) {
      case TRANSPORT_WIFI:
        tName = "WIFI";
        break;
      case TRANSPORT_BES:
        tName = "BES";
        break;
      case TRANSPORT_BIS:
        tName = "BIS";
        break;
      case TRANSPORT_DIRECT_TCP:
        tName = "TCP";
        break;
      case TRANSPORT_WAP2:
        tName = "WAP2";
        break;
      case TRANSPORT_SIM:
        tName = "SIM";
        break;
      default:
        tName = "UNKNOWN";
        break;
      }
      return tName;
    }
  
  }
  </code></pre>