2012-10-24 13 views
41

का उपयोग कर JSON/XML पोस्ट करना मैं android-async-http का उपयोग कर रहा हूं और वास्तव में इसे पसंद करता हूं। मैंने पोस्टिंग डेटा के साथ एक समस्या में भाग लिया है। मैं निम्न स्वरूप में एपीआई के लिए डेटा पोस्ट करने के लिए है: -एंड्रॉइड-एसिंक-http (loopj)

<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 भी पोस्ट कर सकते हैं। कोई विचार?

उत्तर

106

Loopj पोस्ट उदाहरण सेट 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); 
+1

यह पाश जे –

+0

धन्यवाद टिमोथी अपने 'अच्छा –

+0

धन्यवाद टिमोथी और मस के लिए काम करता है। –

0

बस अपनी एक्सएमएल या जेसन को एक स्ट्रिंग पर लिखें और उचित हेडर या बिना सर्वर के लिए भेजें।

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

पोस्ट करने के लिए:

private static AsyncHttpClient client = new AsyncHttpClient(); 

RequestParams के माध्यम से सामान्य रूप से पोस्ट करने के लिए: अपने ट्विटर उदाहरण से बढ़ाया है - और हाँ "सामग्री प्रकार" के लिए "application/json"

1

एक्सएमएल

०१२३५१६४१० पोस्ट करने के लिए
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 
    }); 
} 
19

@ टिमोथी उत्तर मेरे लिए काम नहीं करता था।

मैं StringEntity की Content-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); 

गुड लक :)

+0

के साथ काम किया यह कहता है - "उत्तीर्ण सामग्री टाइप को अनदेखा कर दिया जाएगा क्योंकि HttpEntity सामग्री प्रकार सेट करता है"। मैं वही कर रहा हूं जो आपने यहां उल्लेख किया है। –

+0

धन्यवाद, धन्यवाद, धन्यवाद! दोनों पर सामग्री प्रकार सेट करना इकाई और पोस्ट कॉल ने मेरे लिए काम किया है। – user2408952

+1

@ सलमानखन हां, ठीक है, यह अभी भी इस तरह काम करता है। सुनिश्चित करें कि आपने * दोनों * इकाई पर ContentType सेट किया है और उपयोगकर्ता 2408952 की तरह पोस्ट किया है। – Danpe

0

किसी एक समस्या यह है कि httpclient Content-Type: text/plain के रूप में भेजते हैं तो इस लिंक देखें: https://stackoverflow.com/a/26425401/361100

लूपज httpclient कुछ हद तक बदल गया है (या समस्या है) जो StringEntity मूल सामग्री-प्रकार को application/json पर ओवरराइड नहीं कर सकता है।

+0

तो अगर मैं लूपज का उपयोग कर JSON डेटा भेजना चाहता हूं तो मुझे क्या करना चाहिए। –

+0

@ सलमानखान // बस HttpClient.addHeader ("सामग्री-प्रकार", "एप्लिकेशन/जेसन") जोड़ें; आपके '.ost (...);' विधि से ऊपर। – Youngjae

0

आप JSON स्ट्रिंग विशेष प्रकार की एक InputStream के रूप में जोड़ सकते हैं - मैं ByteArrayStream का उपयोग किया है, तो आप correctMimeType JSONObject स्थापित करना चाहिए तो RequestParams को इसे पारित

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

बस यह सुनिश्चित करने के लिए और फिर परिवर्तित "कुछ डेटा" स्ट्रिंग करें और बस "बाइटएरेएन्टिटी"

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

यह मेरे लिए ठीक काम कर रहा है।

3

एक बेहतर तरीका 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) { 
     } 
    }); 
+1

यह विधि नेस्टेड JSON के लिए काम नहीं करती है –

0

एक php सर्वर से xml फ़ाइल पोस्ट करने के लिए: एंड्रॉयड-async-http-1.4.9 जोड़ने के बाद

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

}

। एंड्रॉइड स्टूडियो के लिए जार, बिल्ड करने के लिए जाएं।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" />