Truy cập localhost: cổng từ trình giả lập Android


224

Tôi đang chạy một dịch vụ web trên máy cục bộ của tôi chạy localhost:54722.

Tôi muốn gọi dịch vụ từ một ứng dụng chạy trong trình giả lập Android.

Tôi đọc được rằng sử dụng 10.0.2.2trong ứng dụng sẽ truy cập localhost, nhưng dường như nó cũng không hoạt động với số cổng. Nó nói HttpResponseException: Bad Request.



1
Tôi mong đợi hành vi, rằng không phải tất cả các cổng đều được chuyển tiếp ... 5555 không được chuyển tiếp nhưng 8080 và 8081 vẫn hoạt động tốt ...
Florian Loch

Bạn cần chỉnh sửa tệp cấu hình vs-iis của mình: stackoverflow.com/a/50991257/7149454
Nick Kovalsky

Câu trả lời:


408

Bạn có thể truy cập máy chủ của mình bằng địa chỉ IP " 10.0.2.2".

Điều này đã được thiết kế theo cách này bởi nhóm Android. Vì vậy, máy chủ web của bạn hoàn toàn có thể chạy tại localhost và từ ứng dụng Android của bạn, bạn có thể truy cập nó thông qua " http://10.0.2.2:<hostport>".

Nếu trình giả lập của bạn phải truy cập internet thông qua máy chủ proxy, bạn có thể định cấu hình proxy HTTP tùy chỉnh từ màn hình Điều khiển mở rộng của trình giả lập. Khi trình giả lập mở, bấm Thêm dấu chấm , rồi bấm Cài đặtProxy . Từ đây, bạn có thể xác định cài đặt proxy HTTP của riêng mình. ảnh chụp màn hình cho cấu hình HTTP


9
Tại sao nên làm thế? Lỗi Yêu cầu xấu có nghĩa là máy chủ localhost có thể truy cập được, nhưng yêu cầu đó không hoàn toàn chính xác ..
Dediqated

Tôi không chắc chắn, tôi làm theo, chính xác những gì bạn đang nói, nó có liên quan đến giải pháp được cung cấp không ??
Akhil Jain

Không hoạt động với tôi ngay bây giờ, nhưng đây là liên kết đến các tài liệu Android và rõ ràng đây là điều cần làm (10.0.2.2); developer.android.com/tools/devices/emulator.html
Stuart Hallows

23
rõ ràng điều này không làm rõ bất cứ điều gì, Robin đã sử dụng ip 10.0.2.2 trong câu hỏi và nó không hoạt động. Mặc dù câu trả lời của bạn là đúng, nhưng nó KHÔNG cung cấp giải pháp.
iversoncru

Tôi cũng nhận được 400: Lỗi yêu cầu xấu với cùng một giải pháp.
Keval Patel

55

Sử dụng 10.0.2.2 cho AVD mặc định và 10.0.3.2 cho Genymotion


4
Tại sao 10.0.3.2 cho Genymotion?
Jacob

1
@Jacob Bởi vì Genymotion là một trình giả lập khác và họ đã chọn sử dụng một ip khác với trình giả lập của google (Biên giới này vô dụng. Nghiêm túc, khi nào họ sẽ làm gì đó với trình giả lập mặc định khủng khiếp của họ?)
máy tính

Trong API 28+, bạn cũng nên cho phép lưu lượng truy cập không phải là https (văn bản rõ ràng) trong cấu hình mạng của mình. Xem câu trả lời của tôi dưới đây stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

Tôi gặp vấn đề tương tự trên Visual Studio khi thực hiện một ứng dụng web trên IIS Express. Để khắc phục, bạn cần truy cập vào thuộc tính dự án của mình, sau đó nhấp vào Tab Gỡ lỗi và thay đổi http: // localhost: [ PORT CỦA BẠN ] thành http://127.0.0.1:[YOUR PORT] và đặt url android thành http: / /10.0.2.2:[YOUR PORT]. nó làm việc cho tôi


1
điều này kết hợp với url 10.0.0.2 đã giải quyết nó cho tôi. cài đặt này dường như ghi đè lên cách tiếp cận hosting.json được giải thích ở nơi khác.
dùng761574

1
Tôi đang chạy máy chủ django cục bộ trên macOS và thường tôi truy cập nó qua http://localhost:5000/cả trình giả lập Postman và iOS. Giải pháp này hoạt động cho trình giả lập Android và không cần sửa đổi máy chủ của tôi cũng như bất kỳ cài đặt nào trong trình giả lập. Nhanh chóng, đẹp và di động cho các máy tính khác mà không cần làm thêm.
John Pang

Ứng dụng Android với API Web xamarin và ASP.NET đều sử dụng VS. ĐÃ LÀM VIỆC! Cảm ơn!!
sohaib đã nói đùa

15

Nếu bạn đang sử dụng IIS Express, bạn có thể cần liên kết với tất cả tên máy chủ thay vì chỉ 'localhost'. Kiểm tra câu trả lời tốt này:

https://stackoverflow.com/a/15809698/383761

Nói với IIS Express để liên kết với tất cả các địa chỉ IP và tên máy chủ. Trong tệp .config của bạn (thường là% userprofile% \ My Documents \ IISExpress \ config \ applicationationhost.config hoặc $ (SolutionDir) .vs \ config \ applicationationhost.config cho Visual Studio 2015), hãy tìm phần tử ràng buộc của trang web của bạn và thêm

<binding protocol="http" bindingInformation="*:8080:*" />

Đảm bảo thêm nó dưới dạng ràng buộc thứ hai thay vì sửa đổi trang hiện có hoặc VS sẽ chỉ thêm lại một trang web mới được gắn với (1) Ngoài ra, bạn có thể cần chạy VS với tư cách quản trị viên.


Không, không phải lúc nào bạn cũng cần sử dụng tên máy chủ trống, blog.lextudio.com / Từ
Lex Li

<bind Protocol = "http" bindIn information = "*: 15000: 127.0.0.1" /> đây là cách IIS Express thích trong đó 15000 là cổng của tôi và sau đó trỏ đến 10.0.2.2:15000 trên trình giả lập Android
dpineda

11

Tôi đã giải quyết nó bằng cách cài đặt "Băng tải bằng Keyoti" trong Visual Studio Professional 2015. Băng tải tạo một địa chỉ XÓA (IP của bạn) với một cổng (45455) cho phép yêu cầu bên ngoài. Thí dụ:

nhập mô tả hình ảnh ở đây

Băng tải cho phép bạn kiểm tra các ứng dụng web từ máy tính bảng và điện thoại bên ngoài trên mạng hoặc từ trình giả lập Android (không có http://10.0.2.2:<hostport>)

Các bước trong liên kết sau:

https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti


Nếu bạn không chạy máy chủ web trong Visual Studio thì sao? Imo, đây không phải là một câu trả lời cho câu hỏi.
JAC

Tôi đã thử nhưng sau một vài ngày, URL đã cho không hoạt động và không tìm thấy bất kỳ giải pháp nào.
Md Imran Choudhury

Sau một thời gian dài vật lộn, điều duy nhất đã thực hiện thủ thuật là cài đặt tiện ích mở rộng này và bật tính năng URL từ xa. Phải mất một chút thời gian để yêu cầu API, nhưng nó hoạt động.
fabian278

9

Tôi có một máy chủ web đang chạy trên localhost của tôi.

Nếu tôi mở trình giả lập và muốn kết nối với localhost thì tôi đang sử dụng 192.168.x.x. Điều này có nghĩa là bạn nên sử dụng địa chỉ ip lan cục bộ của bạn. Nhân tiện, bạn HttpResponseException (Bad Request)không có nghĩa là máy chủ không thể truy cập được.

Một số lỗi khác dẫn đến ngoại lệ này.


9

10.0.2.2không phải là miền an toàn cho Android, bạn phải cho phép các miền không bảo mật trong cấu hình mạng của mình cho API 28+ nơi các kết nối không phải TLS được ngăn chặn theo mặc định.

Bạn có thể sử dụng các cấu hình sau đây của tôi:

Tạo một tệp mới trong tệp chính / res / xml / network_security_config.xml dưới dạng:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>

Và trỏ nó vào AndroidManifest.xml

<application
......
......
android:networkSecurityConfig="@xml/network_security_config">

8

Vấn đề là trình giả lập Android ánh xạ 10.0.2.2tới 127.0.0.1, không phải localhost. Vì vậy, cấu hình máy chủ web của bạn để serveron 127.0.0.1:54722và không localhost:54722. Nên làm vậy.


7

Sau khi chạy máy chủ lưu trữ cục bộ của bạn, bạn đến http://localhost:[port number]/đây, bạn tìm thấy số cổng của mình.

Sau đó lấy địa chỉ IP của bạn từ Command, Mở lệnh windows và gõ ipconfig nhập mô tả hình ảnh ở đây

Trong trường hợp của tôi, IP là 192.168.10.33vì vậy URL của tôi sẽ là http://192.168.10.33:[port number] /. Trong Android, studio sử dụng URL này làm URL của bạn. Và sau đó, đặt URL và số cổng của bạn trong proxy thủ công cho trình giả lập.

nhập mô tả hình ảnh ở đây


3

bạn cần đặt URL là 10.0.2.2:portNr

portNr = cổng được cung cấp bởi ASP.NET Development Server dịch vụ hiện tại của tôi đang chạy localhost:3229/Service.svc

vì vậy url của tôi là 10.0.2.2:3229

tôi đã khắc phục vấn đề của mình theo cách này

tôi hy vọng nó sẽ giúp ...


3

"BadRequest" là một lỗi thường được gửi bởi chính máy chủ, xem rfc 2616

10.4.1 400 Yêu cầu xấu

Máy chủ không thể hiểu được yêu cầu do cú pháp không đúng. Khách hàng KHÔNG NÊN lặp lại yêu cầu mà không sửa đổi.

Vì vậy, bạn đã có một kết nối làm việc với máy chủ, nhưng yêu cầu của bạn không phù hợp với hình thức expecet. Tôi không biết bạn tạo kết nối như thế nào, bao gồm các tiêu đề (nếu có) - nhưng đó là những gì bạn nên kiểm tra.

Nếu bạn cần thêm trợ giúp, hãy giải thích mã của bạn là gì và nó sử dụng gì để kết nối với Máy chủ, để chúng tôi có bức tranh lớn.

Đây là một câu hỏi với cùng một vấn đề - câu trả lời là loại nội dung không được đặt trong tiêu đề.


Bạn đã đúng điểm, nhưng đã đi sai hướng sau đó. Bước tiếp theo là phân tích máy chủ để tìm hiểu loại yêu cầu mà nó quan tâm, để hiểu lý do tại sao các yêu cầu từ trình giả lập được trả lời với 400. Một nghiên cứu trường hợp cho IIS Express có thể được tìm thấy ở đây, blog.lextudio.com/
Lex Li

1

Tôi muốn chỉ cho bạn cách tôi truy cập API Web IISExpress từ Trình giả lập Android. Tôi đang sử dụng Visual Studio 2015. Và tôi gọi Trình giả lập Android từ Android Studio.

Tất cả những gì tôi cần làm là thêm dòng sau vào cấu hình ràng buộc trong tệp applicationationhost.config của tôi

<binding protocol="http" bindingInformation="*:<your-port>:" />

Sau đó, tôi kiểm tra và sử dụng Địa chỉ IP4 để truy cập API của mình từ trình giả lập Android

Yêu cầu: bạn phải chạy Visual Studio với tư cách Quản trị viên. Bài này cung cấp một cách hoàn hảo để làm điều này.

Để biết thêm chi tiết, vui lòng truy cập bài viết của tôi trên github

Hi vọng điêu nay co ich.


2
Hoặc cài đặt Tiện ích mở rộng VS miễn phí có tên Conveyor từ cửa sổ Tiện ích mở rộng. Điều đó mở IIS Express cho các yêu cầu bên ngoài mà không thay đổi cấu hình.
Jim W nói phục hồi Monica

Bạn có các tùy chọn khác, blog.lextudio.com/ , hơn là chạy VS với tư cách quản trị viên. Vì vậy, tôi sẽ không gọi đó là phải .
Lex Li

1

Đối với người dùng Homestead Homestead: Nếu bất cứ ai sử dụng Laravel với homestead, bạn có thể truy cập phụ trợ ứng dụng bằng cách sử dụng 192.168.10.10 trong trình giả lập

Vẫn không làm việc? Một giải pháp tốt khác là sử dụng ngrok https://ngrok.com/


1

Tôi đang sử dụng Windows 10 làm nền tảng phát triển của mình, truy cập 10.0.2.2:port trong trình giả lập của tôi không hoạt động như mong đợi và cũng là kết quả tương tự cho các giải pháp khác trong câu hỏi này.

Sau vài giờ đào, tôi thấy rằng nếu bạn thêm đối số -writable-system vào lệnh khởi động trình giả lập, mọi thứ sẽ hoạt động.

Bạn phải bắt đầu một trình giả lập thông qua dòng lệnh như dưới đây:

 emulator.exe -avd <emulator_name> -writable-system

Sau đó, trong trình giả lập, bạn có thể truy cập dịch vụ API của mình đang chạy trên máy chủ, sử dụng địa chỉ IP LAN và cổng ràng buộc:

http://192.168.1.2:<port>

Hy vọng điều này sẽ giúp bạn ra ngoài.

Giới thiệu về trình giả lập bắt đầu từ dòng lệnh: https://developer.android.com/studio/run/emulator-commandline .


1

Để truy cập localhost trên Trình giả lập Android

  • Thêm sự cho phép internet từ AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

  • Thêm android:usesCleartextTraffic="true", thêm chi tiết ở đây :

  • Chạy lệnh được đề cập dưới đây để tìm địa chỉ IP hệ thống của bạn:

ifconfig | grep "inet " | grep -v 127.0.0.1

Sao chép địa chỉ IP thu được từ bước này (A)

  • Chạy ứng dụng phụ trợ của bạn, mà bạn có thể truy cập tại localhosthoặc 127.0.0.1từ sytem của mình.

  • Bây giờ trong studio android, bạn có thể thay thế URL nếu bạn đang sử dụng mã hoặc Bạn có thể sử dụng địa chỉ IP thu được từ bước (A) và thử mở trong trình duyệt web, Giống như thế này http://192.168.0.102:8080/

Đừng quên thêm PORT sau địa chỉ IP, trong trường hợp ứng dụng của tôi đang chạy trên cổng 8080 vì vậy tôi đã thêm IP thu được trong (A) với cổng 8080


0

localhost dường như hoạt động tốt trong trình giả lập của tôi khi bắt đầu và sau đó tôi bắt đầu bị từ chối kết nối, tôi đã sử dụng 127.0.2.2 từ trình duyệt giả lập và nó hoạt động và khi tôi sử dụng ứng dụng này trong ứng dụng Android trong trình giả lập, nó lại bắt đầu hiển thị vấn đề từ chối kết nối .

sau đó tôi đã làm ifconfig và tôi đã sử dụng ip 192.168.2.2 và nó hoạt động hoàn hảo


0

Yêu cầu xấu thường có nghĩa là định dạng của dữ liệu bạn đang gửi không chính xác. Có thể là ánh xạ dữ liệu không khớp. Nếu bạn nhận được yêu cầu xấu ngụ ý bạn có thể kết nối với máy chủ, nhưng yêu cầu không được gửi đúng cách.


0

Nếu bất cứ ai vẫn đang tìm kiếm điều này, đây là cách nó làm việc cho tôi.

Bạn cần tìm IP của máy liên quan đến thiết bị / trình giả lập bạn đang kết nối. Đối với Trình giả lập trên đường đi là bằng cách làm theo các bước dưới đây;

  1. Chuyển đến hộp ảo VM -> chọn thiết bị được kết nối trong danh sách.
  2. Chọn Cài đặt -> Mạng-> Tìm hiểu xem thiết bị được gắn vào mạng nào. Đối với tôi đó là 'Bộ điều hợp Ethernet chỉ dành cho máy chủ VirtualBox # 2'.
  3. Trong hộp ảo, đi tới Tệp-> Tùy chọn-> Mạng-> Mạng chỉ dành cho máy chủ và tìm hiểu IPv4 cho mạng được chỉ định ở bước trên. (Bằng cách di chuột, bạn sẽ nhận được thông tin)

Cung cấp IP này để truy cập localhost từ trình giả lập. Cổng giống như bạn đã cung cấp trong khi chạy / xuất bản dịch vụ của mình.

Lưu ý số 1: Đảm bảo bạn đã quan tâm đến tường lửa và quy tắc gửi đến.

Lưu ý # 2: Vui lòng kiểm tra IP này sau khi bạn khởi động lại máy. Vì một số lý do, ngay cả khi tôi đã cung cấp "Sử dụng IP sau" IP Chỉ dành cho máy chủ đã bị thay đổi.


0

Tôi đã giải quyết chính xác vấn đề khi lớp dịch vụ đang sử dụng Visual Studio IIS Express. Chỉ cần trỏ đến 10.0.2.2:port sẽ không hoạt động. Thay vì loay hoay với IIS Express như được đề cập bởi các bài đăng khác, tôi chỉ cần đặt proxy trước IIS Express. Ví dụ, apache hoặc nginx. Các nginx.conf sẽ trông như thế nào

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

    location / {
        proxy_pass http://localhost:54722;
    }
  }

Sau đó, Android cần trỏ đến địa chỉ IP của tôi là 192.168.xx: 8090


0

nếu bạn đang sử dụng một số gói bên thứ 3 như nút express hoặc angular-cli, bạn sẽ cần tìm IP của máy và gắn máy chủ của mình vào IP đó trong cấu hình khởi động máy chủ (thay vì localhost). Sau đó khởi chạy nó từ trình giả lập sử dụng IP. Ví dụ, tôi đã phải sử dụng: ng serve -H 10.149.212.104để sử dụng angular-cli. Sau đó, từ trình giả lập tôi đã sử dụng:http://10.149.212.104:4200


0

1) Chạy lệnh ipconfig trong cmd

2) Bạn sẽ nhận được kết quả như thế này nhập mô tả hình ảnh ở đây

3) Sau đó sử dụng Địa chỉ IPv4 của Bộ điều hợp mạng VMWare 1 theo sau là số cổng

Trong trường hợp của tôi là 8080, vì vậy thay vì sử dụng localhost: 8080

Tôi đang sử dụng 192.168.56.1:8080

nhập mô tả hình ảnh ở đây

Làm xong.....


0

Giải thích tại sao localhostkhông có sẵn từ trình giả lập cho bất kỳ ai có vấn đề truy cập cơ bản. Đối với trường hợp tinh vi đọc câu trả lời khác.

Vấn đề: Trình giả lập có mạng cục bộ riênglocalhostánh xạ tới trình giả lập , nhưng KHÔNG phải máy chủ của bạn!

Giải pháp:

  1. Liên kết máy chủ của bạn 0.0.0.0để làm cho nó có sẵn cho mạng của trình giả lập
  2. Nhận địa chỉ IP bên ngoài của máy tính xách tay của bạn: ifconfiglệnh cho Mac
  3. Trong Android (hoặc ứng dụng Flutter), hãy sử dụng địa chỉ IP của giao diện bên ngoài của bạn như: 192.168.1.10thay vìlocalhost

0

Tôi gặp vấn đề tương tự khi tôi đang cố gắng kết nối với IIS .NET Webservice từ trình giả lập Android.

  1. Tải về npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 đến proxy IIS express port tới 9000 và truy cập cổng 9000 từ trình giả lập như "http://10.0.2.2:9000"

Lý do dường như là theo mặc định, IIS Express không cho phép kết nối từ mạng https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+hostname+when+accessing+localhost+Web+API + hoặc + Web + Ứng dụng + từ + trên + LAN

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.