2013-12-23 7 views
9

Ich muss eine http Post Anfrage mit einem JSON String, den ich bereits generiert habe, machen. Ich habe versucht, verschiedene zwei verschiedene Methoden:HTTP POST Anfrage mit JSON String in JAVA

1.HttpURLConnection 
2.HttpClient 

aber ich habe das gleiche „unerwünschte“ resultieren aus beiden. Mein Code bisher mit HttpURLConnection ist:

public static void SaveWorkflow() throws IOException { 
    URL url = null; 
    url = new URL(myURLgoeshere); 
    HttpURLConnection urlConn = null; 
    urlConn = (HttpURLConnection) url.openConnection(); 
    urlConn.setDoInput (true); 
    urlConn.setDoOutput (true); 
    urlConn.setRequestMethod("POST"); 
    urlConn.setRequestProperty("Content-Type", "application/json"); 
    urlConn.connect(); 

    DataOutputStream output = null; 
    DataInputStream input = null; 
    output = new DataOutputStream(urlConn.getOutputStream()); 

       /*Construct the POST data.*/ 
    String content = generatedJSONString; 

    /* Send the request data.*/ 
    output.writeBytes(content); 
    output.flush(); 
    output.close(); 

    /* Get response data.*/ 
    String response = null; 
    input = new DataInputStream (urlConn.getInputStream()); 
    while (null != ((response = input.readLine()))) { 
     System.out.println(response); 
     input.close(); 
    } 
} 

Mein Code bisher mit Httpclient ist:

public static void SaveWorkflow() { 
    try { 

     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost postRequest = new HttpPost(myUrlgoeshere); 
     StringEntity input = new StringEntity(generatedJSONString); 
     input.setContentType("application/json;charset=UTF-8"); 
     postRequest.setEntity(input); 
     input.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json;charset=UTF-8")); 
     postRequest.setHeader("Accept", "application/json"); 
     postRequest.setEntity(input); 

     HttpResponse response = httpClient.execute(postRequest); 

     BufferedReader br = new BufferedReader(
         new InputStreamReader((response.getEntity().getContent()))); 

     String output; 

     while ((output = br.readLine()) != null) { 
      System.out.println(output); 
     } 

     httpClient.getConnectionManager().shutdown(); 

    } catch (MalformedURLException e) { 

     e.printStackTrace(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

    } 
} 

Wo JsonString erzeugt wird, wie folgt aus:

{"description":"prova_Process","modelgroup":"","modified":"false"} 

Die Antwort bekomme ich ist:

{"response":false,"message":"Error in saving the model. A JSONObject text must begin with '{' at 1 [character 2 line 1]","ids":[]} 

Irgendeine Idee bitte?

+0

Haben Sie den String für ein Objekt nur versucht Umwandlung (Parsen der JSON) ohne den HTTP-Übertragungsschritt in der Mitte? –

+0

Versuchen Sie mit generatedJSONString.trim() – aquaraga

+0

sieht aus wie Sie einen RESTful Webservice verwenden möchten; Vielleicht möchten Sie Ihr Leben sehr einfach gestalten, indem Sie die JAX-RS API anwenden. – Gimby

Antwort

8

Schließlich schaffte ich die Lösung für mein Problem zu finden ...

public static void SaveWorkFlow() throws IOException 
    { 
     CloseableHttpClient httpClient = HttpClients.createDefault(); 
     HttpPost post = new HttpPost(myURLgoesHERE); 
     List<NameValuePair> params = new ArrayList<>(); 
     params.add(new BasicNameValuePair("task", "savemodel")); 
     params.add(new BasicNameValuePair("code", generatedJSONString)); 
     CloseableHttpResponse response = null; 
     Scanner in = null; 
     try 
     { 
      post.setEntity(new UrlEncodedFormEntity(params)); 
      response = httpClient.execute(post); 
      // System.out.println(response.getStatusLine()); 
      HttpEntity entity = response.getEntity(); 
      in = new Scanner(entity.getContent()); 
      while (in.hasNext()) 
      { 
       System.out.println(in.next()); 

      } 
      EntityUtils.consume(entity); 
     } finally 
     { 
      in.close(); 
      response.close(); 
     } 
    } 
+2

können Sie die erforderlichen Gläser für diese –

+1

gehen Sie gehen ---> Kompilieren Sie Gruppe: 'org.apache.httpcomponents', Name : 'httpclient-android', Version: '4.3.5.1' | aber es ist veraltet, also versuche etwas anderes zu finden: - \ – XcodeNOOB

0

Eine andere Möglichkeit, dies zu erreichen, wie unten dargestellt ist:

public static void makePostJsonRequest(String jsonString) 
{ 
    HttpClient httpClient = new DefaultHttpClient(); 
    try { 
     HttpPost postRequest = new HttpPost("Ur_URL"); 
     postRequest.setHeader("Content-type", "application/json"); 
     StringEntity entity = new StringEntity(jsonString); 

     postRequest.setEntity(entity); 

     long startTime = System.currentTimeMillis(); 
     HttpResponse response = httpClient.execute(postRequest); 
     long elapsedTime = System.currentTimeMillis() - startTime; 
     //System.out.println("Time taken : "+elapsedTime+"ms"); 

     InputStream is = response.getEntity().getContent(); 
     Reader reader = new InputStreamReader(is); 
     BufferedReader bufferedReader = new BufferedReader(reader); 
     StringBuilder builder = new StringBuilder(); 
     while (true) { 
      try { 
       String line = bufferedReader.readLine(); 
       if (line != null) { 
        builder.append(line); 
       } else { 
        break; 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     //System.out.println(builder.toString()); 
     //System.out.println("****************"); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
}