2016-05-30 3 views
0

Ich erstelle eine App zum Stellen/Beantworten von Fragen. Ich habe ein Problem mit der POST-Anfrage, wenn ich Fragen stelle.Senden einer korrekten POST-Anfrage in Java (Android Studio) nicht möglich

Ich habe versucht,

curl -H "Content-Type: application/json" -d '{"firstName":"Chris", "lastName": "Chang", "email": "[email protected]"}' http://your-app-name.herokuapp.com/contacts 

in Terminal

so etwas zu verwenden und es funktionierte gut.

Aber wenn ich versuche, eine POST-Anfrage in AndroidStudio zu senden, werden meine Parameter (wie Name, Nachname, E-Mail und usw.) nicht gesendet. Ich habe versucht, https://github.com/kevinsawicki/http-request zu verwenden. Die Anfrage wird gesendet (das weiß ich, weil sie das Datum der Anfrage anzeigt), aber ohne irgendwelche Parameter.

Was sollte in meinem Code geändert werden, damit es richtig funktioniert?

Map<String, String> data = new HashMap<String, String>(); 
data.put("firstName", "Gena"); 
data.put("lastName", "Bukin"); 
if (HttpRequest.post("https://safe-citadel-91138.herokuapp.com/questions").form(data).created()) 
System.out.println("User was created"); 
+0

Informationen verwendet, die in HashMap ist auf dem Server nicht senden (Oder vielleicht ist es gesendet, aber die Anfrage wurde nicht korrekt erstellt) –

+1

Haben Sie versucht, es mit Volley zu senden? –

+0

Wenn Sie zu [link] (https://safe-citadel-91138.herokuapp.com/questions) gehen, können Sie sehen, dass die ersten 3 Anfragen vom Terminal gesendet wurden, und die anderen wurden von Java –

Antwort

0

Ich habe gerade versucht, einen Benutzer zu erstellen, und es hat funktioniert. Sie können die link aktualisieren, die Sie freigegeben haben, um den erstellten Benutzer zu überprüfen.

Dies ist, was ich

String endPoint= "https://safe-citadel-91138.herokuapp.com/questions"; 
     try { 

      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost post = new HttpPost(endPoint); 
      post.addHeader("Content-Type", "application/json"); 
      JSONObject obj = new JSONObject(); 

      obj.put("firstName", "TESTF"); 
      obj.put("lastName", "TESTL"); 
      obj.put("email", "[email protected]"); 

      StringEntity entity = new StringEntity(obj.toString()); 
      post.setEntity(entity); 
      HttpResponse response = httpClient.execute(post); 
}catch (Exception e){ 

     } 

UPDATE

BTW haben versucht, habe ich json jar von this Link

+0

Vielen Dank, es hat funktioniert !! Übrigens, Android hat die Unterstützung für den Apache HTTP-Client entfernt –

+0

@ValentinaPakhomova froh! das hat geholfen !! – Raghavendra

0

Grundsätzlich Ihre curl Anforderungen sendet die Benutzerdaten im JSON-Format in der Anfrage Körper. Ihr Java-Code versucht, die Daten in der Anfrage als Formulardaten zu senden, die etwas anders sind und wahrscheinlich vom Server nicht akzeptiert werden.

Möglicherweise müssen Sie Ihren Code ändern, um die HttpRequest.send(...) Methode anstelle von form verwenden:

JSONObject json = new JSONObject(); 
json.put("firstName", "Gena"); 
json.put("lastName", "Bukin"); 
json.put("email", "[email protected]"); 

HttpRequest 
    .post("https://safe-citadel-91138.herokuapp.com/questions") 
    .contentType("application/json") 
    .send(json.toString()); 

Außerdem im curl rufen Sie verwenden greift auf eine andere URL als in der Java-Snippet http://your-app-name.herokuapp.com/contacts vs https://safe-citadel-91138.herokuapp.com/questions vielleicht Sie sind Auch mit dem falschen Endpunkt sprechen?

Sie können sich einige Java zu JSON Mapping-Bibliothek wie gson für die Umwandlung Ihrer Java-Objekte in richtige JSON oder JSONObject Klasse von Android zu nehmen.

UPDATE:

  • hinzugefügt Link für JSON-Mapping
  • Aktualisiert Code-Schnipsel Gson JSONObject für das JSON-Mapping diese Hoffnung versuchen
0

zu verwenden, es wird

arbeiten
public JSONObject getJSONFromUrl(String url_, JSONObject jsonObject) { 

    try { 
     URLConnection urlConn; 
     DataOutputStream printout; 

     URL url = new URL(url_); 
     urlConn = url.openConnection(); 
     urlConn.setDoInput(true); 
     urlConn.setDoOutput(true); 
     urlConn.setConnectTimeout(30000); 
     urlConn.setReadTimeout(30000); 
     urlConn.setUseCaches(false); 
     urlConn.setRequestProperty("Content-Type", "application/json"); 
     urlConn.setRequestProperty("Accept", "application/json"); 

     urlConn.setRequestProperty("Authorization", "token"); // If Applicable 
     urlConn.connect(); 
     printout = new DataOutputStream(urlConn.getOutputStream()); 
     printout.writeBytes(jsonObject.toString()); 
     printout.flush(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); 

     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     printout.close(); 
     reader.close(); 
     json = sb.toString(); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    Applog.e("response", jObj + ""); 
    return jObj; 

} 
0

Versuchen Sie so ..

Map<String, Object> params = new LinkedHashMap<>(); 
params.put("firstName", "Gena"); 
params.put("lastName", "Bukin"); 


JSONObject jsonObject = POST("https://safe-citadel-91138.herokuapp.com/questions", params); 
    /** 
     * Method allows to HTTP POST request to the server to send data to a specified resource 
     * @param serverURL URL of the API to be requested 
     * @param params parameter that are to be send in the "body" of the request Ex: parameter=value&amp;also=another 
     * returns response as a JSON object 
     */ 
     public JSONObject POST(String serverURL, Map<String, Object> params) { 
      JSONObject jsonObject = null; 
      try { 
       URL url = new URL(serverURL); 

       Log.e(TAG, params.toString()); 
       StringBuilder postData = new StringBuilder(); 

       for (Map.Entry<String, Object> param : params.entrySet()) { 
        if (postData.length() != 0) postData.append('&'); 
        postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
        postData.append('='); 
        postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
       } 
       Log.e("POST", serverURL + ":" + params.toString()); 
       byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setRequestProperty("Content-Type", "application/json"); 
       connection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); 
       connection.setRequestMethod("POST"); 
       connection.setConnectTimeout(5000); 
       connection.setUseCaches(false); 
       connection.setDoOutput(true); 
       connection.getOutputStream().write(postDataBytes); 
       connection.connect(); 

       int statusCode = connection.getResponseCode(); 
       if (statusCode == 200) { 
        sb = new StringBuilder(); 
        reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
        String line; 
        while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
        } 
       } 
       jsonObject = new JSONObject(sb.toString()); 
      } catch (Exception e) { 
       //e.printStackTrace(); 
      } 
      return jsonObject; 
     }