使用Android-Async-HTTP(LOOPJ)发布JSON/XML



我正在使用android-ashnc-http,并且真的很喜欢。我遇到了发布数据的问题。我必须以以下格式将数据发布到API: -

<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>

根据文档,我尝试使用RequestParams进行操作,但它失败了。这是其他方法吗?我也可以发布等效的JSON。有什么想法吗?

loopj post示例 - 从其Twitter示例延长:

private static AsyncHttpClient client = new AsyncHttpClient();

正常通过RequestParams发布:

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

发布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答案对我不起作用。

我定义了StringEntityContent-Type以使其起作用:

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);

祝你好运:)

发布JSON的更好方法

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) {
        }
    });

发布xml

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
    });
}

只需将您的XML或JSON写入字符串,然后以适当的标头发送到服务器。是的,将" content-type"设置为"应用程序/json"

如果某人有httpclient作为Content-Type: text/plain发送的问题,请参考此链接:https://stackoverflow.com/a/a/26425401/361100

loopj httpclient有所更改(或有问题),它不能覆盖StringEntity本机内容类型为application/json

您可以将JSON字符串作为某种输入流添加 - 我使用了bytearraystream,然后将其传递到RequestParams,您应该设置正确的mimimetype

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

只需进行jsonobject,然后将其转换为字符串" somedata",然后以" bytearrayentity"发送

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

它对我来说很好。

将XML文件发布到PHP服务器:

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);
        }
    });
}

}

在添加Android-async-Http-1.4.9.jar到Android Studio之后,转到build.gradle并添加: compile 'com.loopj.android:android-async-http:1.4.9'依赖项

和AndroidManifest.xml添加:

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

最新更新