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?
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);
@ 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 :)
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) {
}
});
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
});
}
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.
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.
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);
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
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" />