2015-11-14 64 views
13

我在反應原生Android應用中使用抓取API向本地API發出請求。我通常在http://localhost:8163查詢反應網絡應用程序的API。React原生Android抓取失敗,連接到本地API

我在調試器模式下在我的物理設備上測試我的應用程序。我在某處讀到反應 - 本地不能像Web應用程序一樣查詢本地主機。顯然你必須使用http://10.0.2.2:[PORT_NUMBER_HERE]/,這是根據Android模擬器碼頭的`http://127.0.0.1:[PORT_NUMBER_HERE]的別名。我不確定這是我應該在物理設備上進行測試。

我獲取代碼如下所示:

fetchToken() { 
    fetch('http://10.0.2.2:8163/extension/auth', { 
     method: 'GET', 
     headers: { 
      'Accept': 'application/json', 
      'Content-type': 'application/json' 
     } 
    }) 
    .then((response)) => console.log('successful fetchToken response: ', response.json())) 
    .catch((error) => console.log('fetchToken error: ', error)) 
    .done(); 
} 

請求總是掛起了一會兒,然後到達catch塊與無益的錯誤TypeError: Network request failed(...)。檢查我的本地API的日誌,他們根本不註冊請求。

所以我不知道如果我正確查詢我的本地API來獲取我想要的資源,並且如果我是,我不知道爲什麼獲取失敗。

+1

啊,這是因爲你的Android模擬器是一個不同的機器從本地計算機開發。對於物理設備來說,就像從不同的機器進行測試一樣:要麼有名稱解析系統,要麼使用IP地址 – njzk2

+0

@ njzk2能否詳細說明?我有同樣的問題,但不知道你的名字解析系統是什麼意思?我使用我的計算機的IP地址在反應本機文檔中請求.. –

+0

@ Andrea.cabral名稱解析通常由DNS完成。 – njzk2

回答

17

您無法訪問您的本地開發服務器,因爲該端口尚未被亞行轉發。當您運行react-native run-android時,React Native會將端口8081與您的移動設備映射到USB上。斷開USB連接後,您將無法刷新或重新加載代碼。所以在這種情況下,你可以做2件事情,或者像React Native那樣映射你的本地服務器端口,或者使用你的本地IP地址。

  1. 映射端口

    ,如果您使用的是Android 6.0以上版本里,才能工作。要使用ADB在終端運行下面​​的命令轉發端口:

    adb reverse tcp:8163 tcp:8163 
    

    這將映射本地8163端口移動的8163端口。您將能夠以這種方式訪問​​您的開發服務器。

  2. 使用本地IP地址

    你也可以用你的本地IP陣營本地開發應用程序重新加載它們沒有USB接口。搖動您的設備或長按菜單按鈕打開開發者菜單。打開Dev Settings,然後點擊Debug server host & port for device。在這裏你可以輸入你機器的本地IP,端口號爲8081。例如。如果您的機器的IP是192.168.1.100,那麼您在此處輸入192.168.1.100:8081即可成功連接。現在我們已經介紹了我們可以重新加載應用程序。在此之後,當您想使用本地計算機的開發服務器時,請使用與服務器端口號相同的IP。

你應該很好的去與此。

+0

你是對的。實際上,我自己想出來,它發現它遲緩地首先賞賜一個問題,然後回答它。 – hellogoodnight

+0

:)自學是最好的學習。我很高興你能自己想出來。 –

+1

非常感謝你! adb反向救了我!起初我以爲這是一個http與https的事情,並花了很長時間試圖找出如何設置我的本地主機API來使用https而不是http,事實證明這一直是這樣。我不知道爲什麼我沒有考慮我的設備(即使它運行在模擬器中)在默認情況下無法連接到我的計算機上的本地主機:端口。 –

-1

只使用componentDidMount這樣的:

componentDidMount(){ 
    return fetch('http://10.0.2.2:8163/extension/auth') 
     .then((response) => response.json()) 
     .then((responseJson) => { 

      this.setState({ 
       isLoading: false, 
       sem: responseJson 
      }); 
     }) 
     .catch((error) => { 
      console.error(error); 
     }); 
} 

更多:https://facebook.github.io/react-native/docs/network.html

+0

你能解釋一下你的代碼嗎? –