ข้อยกเว้นโฮสต์ที่ไม่ได้รับการแก้ไข Android

ฉันกำลังพยายามเรียกใช้บริการเว็บ RESTful จากแอปพลิเคชัน Android โดยใช้วิธีการต่อไปนี้:

HttpHost target = new HttpHost("http://" + ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
HttpGet get = new HttpGet("/list");
String result = null;
HttpEntity entity = null;
HttpClient client = new DefaultHttpClient();
try {
    HttpResponse response = client.execute(target, get);
    entity = response.getEntity();
    result = EntityUtils.toString(entity);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (entity!=null)
        try {
            entity.consumeContent();
        } catch (IOException e) {}
}
return result;

ฉันสามารถเรียกดูที่อยู่และดูผลลัพธ์ xml โดยใช้เบราว์เซอร์ Android Emulator และจากเครื่องของฉัน ฉันให้สิทธิ์อินเทอร์เน็ตแก่แอปของฉันแล้ว

ฉันกำลังพัฒนาด้วย eclipse

ฉันเคยเห็นมันบอกว่าฉันอาจจำเป็นต้องกำหนดค่าพรอกซี แต่เนื่องจากบริการเว็บที่ฉันโทรอยู่บนพอร์ต 80 สิ่งนี้จึงไม่ควรสำคัญใช่ไหม ฉันสามารถเรียกวิธีการด้วยเบราว์เซอร์ได้

มีความคิดอะไรบ้าง?


person Rob Stevenson-Leggett    schedule 14.06.2009    source แหล่งที่มา
comment
การตั้งค่าพร็อกซีจะไม่สำคัญเว้นแต่ว่าอุปกรณ์ของคุณจะอยู่หลังพร็อกซีเซิร์ฟเวอร์   -  person Jeremy Logan    schedule 15.06.2009
comment
นั่นคือสิ่งที่ฉันกำลังคิด ฉันยังไม่สามารถทำงานได้   -  person Rob Stevenson-Leggett    schedule 16.06.2009


คำตอบ (4)


ฉันคิดว่าปัญหาอาจอยู่ที่บรรทัดแรก:

new HttpHost("http://" + ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);

ตัวสร้าง HttpHost คาดว่าชื่อโฮสต์จะเป็นอาร์กิวเมนต์แรก ไม่ใช่ชื่อโฮสต์ที่มีคำนำหน้า "http://"

ลองลบ "http://" ออกและควรจะได้ผล:

new HttpHost(ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
person Josef Pfleger    schedule 18.06.2009

ข้อผิดพลาดหมายความว่า URL ไม่สามารถแก้ไขได้ผ่าน DNS เป็นปัญหามากมายที่อาจทำให้เกิดสิ่งนี้ หากคุณนั่งอยู่หลังพรอกซี คุณควรกำหนดค่าให้ใช้งาน

HttpHost proxy = new HttpHost(”proxy”,port,”protocol”);
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

ตรวจสอบด้วยว่าสิทธิ์อินเทอร์เน็ตของคุณมีลักษณะเช่นนี้

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

เนื่องจากบางครั้งมันจะไม่ทำงานเป็นแท็กเปล่า

นอกจากนี้ โปรดดู Emulator Networking และส่วนข้อจำกัดที่นั่น

person jitter    schedule 14.06.2009
comment
ฉันไม่แน่ใจเกี่ยวกับการตั้งค่าพร็อกซีเนื่องจากฉันกดที่พอร์ต 80 เท่านั้นและเบราว์เซอร์ของโปรแกรมจำลองสามารถเรียกใช้บริการเว็บได้ - person Rob Stevenson-Leggett; 16.06.2009
comment
สิ่งนี้ทำเพื่อฉันเมื่อใช้ HttpGet ปกติ (http: //host/path); - ดูเหมือนว่า Eclipse จะไม่ใส่แท็ก XML นี้ ขอบคุณ! - person ndrix; 18.02.2011
comment
‹uses-permission android:name=”android.permission.INTERNET”›‹/uses-permission› ก็ใช้ได้ผลสำหรับฉันเช่นกัน - person dan gibson; 27.10.2011

ฉันจะตรวจสอบอีกครั้งว่าตั้งค่าการอนุญาตเครือข่ายอย่างถูกต้อง ลองทำอะไรพื้นฐานๆ เช่น

String address -"http://www.google.com";
URL url = new URL(address);             
InputStream in = url.openStream();

เพื่อตรวจสอบว่าคุณได้ตั้งค่าสิทธิ์ของคุณถูกต้อง

หลังจากนั้นใช้ตัววิเคราะห์โปรโตคอลที่คุณชื่นชอบ (ฉันเป็นแฟนตัวยงของ Wireshark) เพื่อดูว่าคุณกำลังส่งแพ็กเก็ตที่ถูกต้องหรือไม่ ฉันเชื่อว่าคุณต้องส่ง URL ที่สมบูรณ์ไปยัง HTTPGet แต่ฉันมั่นใจเพียงประมาณ 80% เท่านั้น

person hacken    schedule 17.06.2009
comment
ใช่ ฉันสามารถดึงข้อมูลกลับมาได้ด้วยวิธีนี้ อย่างไรก็ตาม ฉันไม่เข้าใจว่าทำไมรหัสต้นฉบับถึงใช้งานไม่ได้ ฉันไม่เห็นอะไรเลยใน Fiddler เลย! - person Rob Stevenson-Leggett; 18.06.2009
comment
วิธีนี้เป็นวิธีที่ถูกต้องในการเรียกใช้บริการเว็บ REST หรือไม่ เช่น. ใช้สตรีมอินพุตเป็นสตริงหรือไม่ - person Rob Stevenson-Leggett; 18.06.2009
comment
เป็นวิธีที่ง่ายมากแต่ก็อาจเพียงพอแล้ว ขึ้นอยู่กับสิ่งที่คุณกำลังทำ ฉันไม่คุ้นเคยกับพู้ทำเล่น แต่ฉันไม่แน่ใจว่ามันเหมือนกับแพ็กเก็ตดมกลิ่นหรือไม่ ฉันเดาว่า URL หรือโฮสต์ผิด ฉันจะลองส่ง URL แบบเต็ม (http:// + ServiceWrapper.SERVER_HOST+//list) และดูว่าจะช่วยได้หรือไม่ - person hacken; 18.06.2009
comment
Fiddler เป็นพร็อกซีการแก้ไขจุดบกพร่องเว็บ (เช่น พร็อกซีเซิร์ฟเวอร์ HTTP ที่ใช้ในการวิเคราะห์การรับส่งข้อมูล HTTP) ดังนั้นจึงไม่ใช่ตัวดมแพ็กเก็ต - person Josef Pfleger; 18.06.2009

เปลี่ยนบรรทัดแรกในรหัสของคุณ:

HttpHost(ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
person SRY    schedule 15.11.2012