2012-09-15 28 views
12

Tôi đang cố triển khai một bài đăng JSON đơn giản tới URL chấp nhận JSON trong cơ thể với xác thực cơ bản trên ANDROID.Android - Bài đăng JSONClient JSON có xác thực cơ bản

Tôi đã thử với HttpUrlConnection nhưng tôi bị "trái phép" và dữ liệu của tôi được gửi tới máy chủ.

Một cách khác mà tôi đã thử đang sử dụng HttpClient, nhưng giờ tôi gặp sự cố khác. Xác thực hoạt động hoàn hảo nhưng dữ liệu không được gửi đến máy chủ ...

Để chắc chắn, tôi thiết lập một thử nghiệm nhỏ trong một dự án Java đơn giản (không phải Môi trường Android).

Đây là mã mà tôi đang sử dụng POST đến server:

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

Các mã trong dự án Java hoạt động hoàn hảo.

Khi tôi thử mã giống hệt nhau trong Android, tôi nhận được internal server error từ máy chủ, điều đó có nghĩa là dữ liệu JSON chưa được nhận.

Tôi thực sự không hiểu tại sao tính năng này hoạt động trong JAVA nhưng không hoạt động trong Android.

Hiệu quả mà tôi muốn đạt được, là lệnh sau:

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/ 

Trả lời

0

Tôi nghĩ bạn không nên sử dụng localhost trong url

+0

Cảm ơn bạn đã trả lời của bạn, tôi chỉ minh họa trong mã này "localhost", trên thực tế tôi sử dụng đường dẫn đầy đủ của tên miền. – user1674948

+0

Từ quan điểm của bạn, đây có phải là cách thực hiện đúng bài đăng cơ thể JSON cho máy chủ không? Có lẽ nó chỉ là một Emulator không hoạt động? – user1674948

+0

Mã của bạn là đúng. Nếu bạn đang thử nghiệm trong Trình giả lập, hãy sử dụng địa chỉ IP 10.0.2.2 thay thế. Tham khảo http://developer.android.com/tools/devices/emulator.html#networkaddresses. – secondflying

2

Cuối cùng, tất cả mọi thứ được sắp xếp. Bất cứ ai có thể gặp vấn đề này sau đây là giải pháp.

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

Base64.encodeToString này gắn thêm "\ n" vào cuối chuỗi ủy quyền. Sau đó trên dòng máy chủ tiếp theo sau khi ký tự "\ n" được coi là phần thân của yêu cầu và dĩ nhiên là không chính xác.

Bằng cách thay thế tất cả các dòng mới trong chuỗi uỷ quyền sẽ giải quyết vấn đề này:

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

Dễ dàng sửa chữa nhưng khó tìm ;-)

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

...

Giải pháp đơn giản hơn một chút:

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

mát mẻ, nó hoạt động! – marchinram

+0

Tôi phải thêm '" "+ authorizationString +" "' để làm cho nó hoạt động (yêu cầu HTTP không hợp lệ.) –

+0

Bây giờ là 'Base64.getEncoder(). EncodeToString (...' – Bohemian

2

Tôi nghĩ rằng cách đơn giản nhất là:

postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false)); 
Các vấn đề liên quan