title: Android JSON api trouble with PUT operations
body: <p>I have a web api I made in asp.net mvc 4 which exposes CRUD operations for a database and an I'm making an android app to try and manipulate this data.</p>
  
  <p>The issue I'm facing is in the json parser with the update operation which is exposed by a http PUT request (/api/products/id)</p>
  
  <p>Here is the parser I'm using which I got from an example, I modified the POST section so that it does PUT instead:</p>
  
  <pre><code>public class JSONParser {
  
  static InputStream is = null;
  static JSONObject jObj = null;
  static JSONArray jArr = null;
  static String json = "";
  
  // constructor
  public JSONParser() {
  
  }
  
  // function get json from url
      // by making HTTP POST or GET method
      public JSONObject makeHttpRequest(String url, String method,
              List&lt;NameValuePair&gt; params) {
  
          // Making HTTP request
          try {
  
              // check for request method
              if (method == "PUT") {
                  DefaultHttpClient httpClient = new DefaultHttpClient();
                  HttpPut httpPut = new HttpPut(url);
                  httpPut.setEntity(new UrlEncodedFormEntity(params));
  
                  HttpResponse httpResponse = httpClient.execute(httpPut);
                  HttpEntity httpEntity = httpResponse.getEntity();
                  is = httpEntity.getContent();
              }
              if(method == "POST"){
                  // request method is POST
                  // defaultHttpClient
                  DefaultHttpClient httpClient = new DefaultHttpClient();
                  HttpPost httpPost = new HttpPost(url);
                  httpPost.setEntity(new UrlEncodedFormEntity(params));
  
                  HttpResponse httpResponse = httpClient.execute(httpPost);
                  HttpEntity httpEntity = httpResponse.getEntity();
                  is = httpEntity.getContent();
  
              }else if(method == "GET"){
                  // request method is GET
                  DefaultHttpClient httpClient = new DefaultHttpClient();
                  String paramString = URLEncodedUtils.format(params, "utf-8");
                  url += "?" + paramString;
                  HttpGet httpGet = new HttpGet(url);
  
                  HttpResponse httpResponse = httpClient.execute(httpGet);
                  HttpEntity httpEntity = httpResponse.getEntity();
                  is = httpEntity.getContent();
              }           
  
          } catch (UnsupportedEncodingException e) {
              e.printStackTrace();
          } catch (ClientProtocolException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
  
          try {
              BufferedReader reader = new BufferedReader(new InputStreamReader(
                      is, "iso-8859-1"), 8);
              StringBuilder sb = new StringBuilder();
              String line = null;
              while ((line = reader.readLine()) != null) {
                  sb.append(line + "\n");
              }
              is.close();
              json = sb.toString();
          } catch (Exception e) {
              Log.e("Buffer Error", "Error converting result " + e.toString());
          }
  
          // try parse the string to a JSON object
          try {
              jObj = new JSONObject(json);
          } catch (JSONException e) {
              Log.e("JSON Parser", "Error parsing data " + e.toString());
          }
  
          // return JSON String
          return jObj;
  
      }
  }
  </code></pre>
  
  <p>When I try to do a PUT operation, the record gets updated but the app crashes with a null pointer exception as it tries to execute <code>is = httpEntity.getContent();</code></p>
  
  <p>I'm having problems trying to figure what is wrong exactly with this because I can't find a detailed explanation on how things are supposed to be done, all I have are the random examples I manage to find, none of which goes past GET and POST operations.</p>
  
  <p>For reference, this is the asynctask that calls the parser:</p>
  
  <pre><code>class SaveProductDetails extends AsyncTask&lt;String, Void, String&gt; {
  
      @Override
      protected String doInBackground(String... args) {
          String id = mTitleText.getText().toString();
          String desc = mBodyText.getText().toString();
          List&lt;NameValuePair&gt; params = new ArrayList&lt;NameValuePair&gt;();
          params.add(new BasicNameValuePair(KEY_ID, id));
          params.add(new BasicNameValuePair(KEY_DESC, desc));
          JSONParser parser = new JSONParser();
          JSONObject json = parser.makeHttpRequest(URL + id, "PUT", params);
  
          try {
              Integer success = json.getInt(TAG_SUCCESS);
              if (success == 1) {
                  // successfully updated
                  Intent i = getIntent();
                  // send result code 100 to notify about product update
                  setResult(100, i);
                  finish();
              } else {
                  // failed to update product
              }
          } catch (JSONException e) {
              e.printStackTrace();
          }
  
          return null;
  
      }
  }
  </code></pre>
  
  <p>What am I doing wrong?</p>