2012-09-15 14 views
12

के साथ एचटीपी क्लाइंट JSON पोस्ट मैं URL पर एक साधारण JSON पोस्ट को कार्यान्वित करने की कोशिश कर रहा हूं जो एंड्रॉइड पर मूल प्रमाणीकरण के साथ जेएसओएन को शरीर में स्वीकार करता है।एंड्रॉइड - मूल प्रमाणीकरण

मैंने HttpUrlConnection के साथ प्रयास किया है लेकिन मुझे "अनधिकृत" मिलता है और मेरा डेटा सर्वर पर भेजता है।

मैंने कोशिश की एक और तरीका HttpClient का उपयोग कर रहा है, लेकिन अब मुझे एक अलग समस्या है। प्रमाणीकरण सही काम करता है लेकिन डेटा सर्वर पर नहीं भेजा जाता है ...

बस यह सुनिश्चित करने के लिए, मैंने एक साधारण जावा प्रोजेक्ट (एंड्रॉइड पर्यावरण नहीं) में एक छोटा परीक्षण स्थापित किया है।

DefaultHttpClient httpClient = new DefaultHttpClient(); 
ResponseHandler<String> resonseHandler = new BasicResponseHandler(); 
HttpPost postMethod = new HttpPost("http://localhost/api/v1/purchase/");  
postMethod.setEntity(new StringEntity("{\"amount_adult\" : 1, \"object_id\" : 13}")); 
postMethod.setHeader("Content-Type", "application/json"); 
String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
postMethod.setHeader("Authorization", authorizationString); 
String response = httpClient.execute(postMethod,resonseHandler); 
System.out.println("response :" + response); 

जावा परियोजना में कोड सही काम करता है:

इस कोड है कि मैं सर्वर पर पोस्ट करने का उपयोग कर रहा है।

जब मैं एंड्रॉइड में सटीक कोड का प्रयास करता हूं, तो मुझे सर्वर से internal server error मिलता है, जिसका अर्थ है कि JSON डेटा प्राप्त नहीं हुआ है।

मुझे वास्तव में समझ में नहीं आता कि यह जावा में क्यों काम कर रहा है लेकिन एंड्रॉइड में नहीं।

curl --dump-header - -H "Content-Type: application/json" -X 
POST --data '{"amount_adult":1, "object_id":13}' 
--user travelbuddy:travelbuddy http://localhost/api/v1/purchase/ 

उत्तर

0

मुझे लगता है कि आप यूआरएल

+0

अपने जवाब के लिए धन्यवाद, मैं सिर्फ इस कोड को "स्थानीय होस्ट" में दिखाया गया है, वास्तव में मैं डोमेन का पूरा पथ का उपयोग करें। – user1674948

+0

आपके अपने बिंदु से, क्या सर्वर पर JSON बॉडी पोस्ट करने का यह सही तरीका है? शायद यह सिर्फ एक एमुलेटर है जो काम नहीं कर रहा है? – user1674948

+0

आपका कोड सही है। यदि आप एम्यूलेटर में परीक्षण कर रहे हैं, तो इसके बजाय आईपी एड्रेस 10.0.2.2 का उपयोग करें। Http://developer.android.com/tools/devices/emulator.html#networkaddresses देखें। – secondflying

2

अंत में, सब कुछ क्रमबद्ध किया जाता है स्थानीय होस्ट उपयोग नहीं करना चाहिए:

प्रभाव है कि मैं प्राप्त करने के लिए चाहते हैं, निम्न आदेश है। कोई भी जो इस समस्या का अनुभव कर सकता है वह समाधान है।

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
postMethod.setHeader("Authorization", authorizationString); 

यह Base64.encodeToString संलग्न कर देता है एक अतिरिक्त "\ n" प्राधिकरण स्ट्रिंग के अंत करने के लिए। फिर सर्वर पर अगली पंक्ति "\ n" चरित्र को अनुरोध के शरीर के रूप में और निश्चित रूप से गलत माना जाता है।

प्राधिकरण स्ट्रिंग में सभी नई लाइनों की जगह इस मुद्दे का समाधान होगा द्वारा:

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe 
authorizationString.replace("\n", ""); 
    postMethod.setHeader("Authorization", authorizationString); 

आसान ठीक लेकिन मुश्किल ;-)

26
String authorizationString = "Basic " + Base64.encodeToString(
    ("travelbuddy" + ":" + "travelbuddy").getBytes(), 
    Base64.DEFAULT); 

...

समाधान वास्तव में थोड़ा सा सरल है:

String authorizationString = "Basic " + Base64.encodeToString(
     ("travelbuddy" + ":" + "travelbuddy").getBytes(), 
     Base64.NO_WRAP); // <=== Do not add '\n' 
+1

अच्छा, यह काम करता है! – marchinram

+0

मुझे इसे काम करने के लिए 'प्राधिकरण' स्ट्रिंग + "" जोड़ना था (HTTP अनुरोध अमान्य था।) –

+0

अब यह 'Base64.getEncoder() है। एनकोड टॉस्ट्रिंग (... ' – Bohemian

2

मुझे लगता है कि सबसे आसान तरीका है:

postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false)); 
संबंधित मुद्दे