web-dev-qa-db-de.com

POST von JSON/XML mit Android-async-http (loopj)

Ich benutze Android-async-http und mag es wirklich. Ich habe ein Problem mit dem POSTing von Daten. Ich muss Daten in folgendem Format an die API senden: - 

<request>
  <notes>Test api support</notes>
  <hours>3</hours>
  <project_id type="integer">3</project_id>
  <task_id type="integer">14</task_id>
  <spent_at type="date">Tue, 17 Oct 2006</spent_at>
</request>

Wie in der Dokumentation beschrieben, habe ich es mit RequestParams versucht, aber es schlägt fehl. Ist das eine andere Möglichkeit, dies zu tun? Ich kann auch POST äquivalentes JSON. Irgendwelche Ideen?

45
Mus

Loopj POST Beispiele - erweitert aus ihrem Twitter-Beispiel:

private static AsyncHttpClient client = new AsyncHttpClient();

Um normalerweise über RequestParams zu posten:

RequestParams params = new RequestParams();
params.put("notes", "Test api support"); 
client.post(restApiUrl, params, responseHandler);

So posten Sie JSON:

JSONObject jsonParams = new JSONObject();
jsonParams.put("notes", "Test api support");
StringEntity entity = new StringEntity(jsonParams.toString());
client.post(context, restApiUrl, entity, "application/json",
    responseHandler);
122
Timothy

@ Timothy Antwort hat bei mir nicht funktioniert.

Ich habe den Content-Type der StringEntity definiert, damit es funktioniert:

JSONObject jsonParams = new JSONObject();
jsonParams.put("notes", "Test api support");

StringEntity entity = new StringEntity(jsonParams.toString());
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

client.post(context, restApiUrl, entity, "application/json", responseHandler);

Viel Glück :)

22
Danpe

eine bessere Möglichkeit, Json zu posten

RequestParams params = new RequestParams();
    params.put("id", propertyID);
    params.put("lt", newPoint.latitude);
    params.put("lg", newPoint.longitude);
    params.setUseJsonStreamer(true);

    ScaanRestClient restClient = new ScaanRestClient(getApplicationContext());
    restClient.post("/api-builtin/properties/v1.0/edit/location/", params, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
        }
    });
5
Samira Ekrami

Um XML zu posten

protected void makePost() {
    AsyncHttpClient client = new AsyncHttpClient();
    Context context = this.getApplicationContext();
    String  url = URL_String;
    String  xml = XML-String;
    HttpEntity entity;
    try {
        entity = new StringEntity(xml, "UTF-8");
    } catch (IllegalArgumentException e) {
        Log.d("HTTP", "StringEntity: IllegalArgumentException");
        return;
    } catch (UnsupportedEncodingException e) {
        Log.d("HTTP", "StringEntity: UnsupportedEncodingException");
        return;
    }
    String  contentType = "string/xml;UTF-8";

    Log.d("HTTP", "Post...");
    client.post( context, url, entity, contentType, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            Log.d("HTTP", "onSuccess: " + response);
        }
          ... other handlers
    });
}
1
Oyaji

Machen Sie einfach JSONObject und konvertieren Sie es in String "someData" und senden Sie es einfach mit "ByteArrayEntity" 

    private static AsyncHttpClient client = new AsyncHttpClient();
    String someData;
    ByteArrayEntity be = new ByteArrayEntity(someData.toString().getBytes());
    client.post(context, url, be, "application/json", responseHandler);

Es funktioniert gut für mich.

0
AndroidLad

Wenn jemand ein Problem hat, das der httpclient als Content-Type: text/plain sendet, verwenden Sie diesen Link: https://stackoverflow.com/a/26425401/361100

Der loopj httpclient wurde etwas geändert (oder hat ein Problem), wodurch StringEntity nativer Content-Type nicht in application/json überschrieben werden kann.

0
Youngjae

Sie können den JSON-String als InputStream hinzufügen. Ich habe den ByteArrayStream verwendet und dann an die RequestParams übergeben

InputStream stream = new ByteArrayInputStream(jsonParams.toString().getBytes(Charset.forName("UTF-8")));
multiPartEntity.put("model", stream, "parameters", Constants.MIME_TYPE_JSON);
0

schreiben Sie einfach Ihren XML- oder Json-Code in einen String und senden Sie ihn an den Server, mit den richtigen Kopfzeilen oder ohne. und yes "Content-Type" auf "application/json" setzen

0

So posten Sie eine XML-Datei an einen PHP-Server:

public class MainActivity extends AppCompatActivity {

/**
 * Send xml file to server via asynchttpclient lib
 */

Button button;
String url = "http://xxx/index.php";
String filePath = Environment.getExternalStorageDirectory()+"/Download/testUpload.xml";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button)findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            postFile();
        }
    });
}

public void postFile(){

    Log.i("xml","Sending... ");

    RequestParams params = new RequestParams();

    try {
        params.put("key",new File(filePath));
    }catch (FileNotFoundException e){
        e.printStackTrace();
    }

    AsyncHttpClient client = new AsyncHttpClient();

    client.post(url, params, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int i, cz.msebera.Android.httpclient.Header[] headers, byte[] bytes) {
            Log.i("xml","StatusCode : "+i);
        }

        @Override
        public void onFailure(int i, cz.msebera.Android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) {
            Log.i("xml","Sending failed");
        }

        @Override
        public void onProgress(long bytesWritten, long totalSize) {
            Log.i("xml","Progress : "+bytesWritten);
        }
    });
}

}

Nachdem Sie Android-async-http-1.4.9.jar zu Android Studio hinzugefügt haben, gehen Sie zu build.gradle Und fügen Sie: compile 'com.loopj.Android:android-async-http:1.4.9' unter Abhängigkeiten hinzu

Und bei AndroidManifest.xml hinzufügen:

<uses-permission Android:name="Android.permission.INTERNET" /> <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />

0
Asif