title: HTTP error 400 Bad Request when POSTing JSON data over HttpURLConnection
body: <p>I have this code below that trying to post JSON data after successfully authenticate through Oauth2.0, the code is like this:</p>
  
  <pre><code>try {            
      URL url = new URL ("https://test.api.neteller.com/v1/oauth2/token?grant_type=client_credentials");
      String test = "QUFBQlNhVlFoUjhlTVhPQjowLm9aV3g2Rkhwd1dIQUZnXzRaMDZwOUoyRWtzaXVHMHEzd2xrVFF4MkRVM28uN0FzUDE4cmZXU0dxVDdqWE1NUGhzSFY4cHU0";
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setRequestMethod("POST");
      connection.setDoOutput(true);
      connection.setRequestProperty  ("Authorization", "Basic " + test);
      String accessToken = "";
      [... get the access token ...]
  
      String urlnew = "https://test.api.neteller.com/v1/transferIn";
      URL obj = new URL(urlnew);
      HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
  
      //add request header
      con.setRequestMethod("POST");
      con.setDoOutput(true);          
      con.setRequestProperty  ("Authorization", "Bearer " + accessToken);
      con.setRequestProperty("Content-Type", "application/json");
  
      // Send post request            
      JSONObject obj2 = new JSONObject();
      obj2.put("paymentMethod", "");
      obj2.put("type", "neteller");
      obj2.put("value", "netellertest_GBP@neteller.com");
      obj2.put("transaction", "");
      obj2.put("merchantRefId", "20140203122501");
      obj2.put("amount",  (5000));
      obj2.put("currency", "USD");
      obj2.put("verificationCode", "411392");
      System.out.print(obj2);             
  
      int responseCode = con.getResponseCode();
      System.out.println("Response Code : " + responseCode);
  
      [... parse response ...]
  } catch(Exception e) {
      e.printStackTrace();
  }
  </code></pre>
  
  <p>I get this error when I run the code above:</p>
  
  <pre><code>java.io.IOException: Server returned HTTP response code: 400 for URL: https://test.api.neteller.com/v1/transferIn
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
      at java.lang.reflect.Constructor.newInstance(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
      at java.security.AccessController.doPrivileged(Native Method)
      at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
      at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
      at example.demo.main(demo.java:71)
  Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://test.api.neteller.com/v1/transferIn
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
      at java.net.HttpURLConnection.getResponseCode(Unknown Source)
      at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
      at example.demo.main(demo.java:65)
  </code></pre>
  
  <p>From the error status 400 I know that the post JSON data is invalid. I suspect maybe in the structure because according to the documentation it should be like this:</p>
  
  <pre><code>{
      "paymentMethod": {
          "type": "neteller",
          "value": "gb_gbp@neteller.com"
      },
      "transaction": {
          "merchantRefId": "20140203122501",
          "amount": 5000,
          "currency": "USD"
      },
      "verificationCode": "234124"
  }
  </code></pre>
  
  <p>So how do I change the JSON parameter so that it could follow the structure in the documentation? </p>