【问题标题】:React Native w/ Expo: Axios post works on emulator, but not on physical deviceReact Native w/ Expo:Axios 帖子在模拟器上工作,但在物理设备上不工作
【发布时间】:2021-03-17 13:41:42
【问题描述】:

我正在尝试在我的 Expo 应用程序上使用 Axios 将图像和一些数据上传到我的 API。代码如下:

// api.ts
import axios from 'axios'

const api = axios.create({
  baseURL: 'http://999.999.999.999/api', // <-- my cloud server ip
  responseType: 'json'
})

export default api
// register.ts
import FormData from 'form-data'  // https://www.npmjs.com/package/form-data
import api from '../services/api'

const options = { headers: 'Content-Type': 'multipart/form-data' } }

export const register = async (formData: FormData): Promise<boolean> => {
  try {
    const response = api.post<{ error: boolean, data: string }>(
      '/authentication/register',
      formData,
      options
    )
    return Boolean(response.data?.data)
  } catch (error) {
    return false
  }
}

我也在使用expo-image-picker 并将结果附加到FormData

const result = await ImagePicker.launchCameraAsync({})

if (result.cancelled) {
  return
}

const personalPhotoUriParts = result.uri.split('.')
const personalPhotoFileType = personalPhotoUriParts[personalPhotoUriParts.length - 1]

const formData = new FormData()

formData.append('email', 'teste@mail.com')
formData.appent('password', '123456')

formData.append('personal_photo', {
  uri: result.uri,
  name: `personal_photo.${personalPhotoFileType}`,
  type: `image/${personalPhotoFileType}`
})

register(formData) // from register.ts

所有的东西都在模拟器上按预期工作,从我得到的 PHP API 正文内容发送和打印:

// var_dump($_POST);
Array [
  "email": "test@mail.com",
  "password": "123456"
]

// var_dump($_FILES)
Object {
  "personal_photo": Object {
    "error": 0,
    "name": "document_photo.jpg",
    "size": 135327,
    "tmp_name": "/tmp/php5o11qT",
    "type": "image/jpg",
  }
}

但是当我尝试从物理设备发送它时,两种情况下我都得到一个空的正文:

// var_dump($_POST);
Array []

// var_dump(get_file_contents('php://input'));
// nothing

// var_dump($_FILES);
Array []

我赌FormData,我使用其他API 路由没有问题(在物理设备上),但是当我不得不使用multipart/form-data 时,我遇到了这个问题。对我来说,这没有任何意义,因为相同的 API 可以在模拟器上与 React JS (WEB)、Postman 和 RN w/ Expo 一起使用。

【问题讨论】:

  • 您是否尝试将 URL 更改为 https 只是为了查看?您是否在任何地方都没有看到任何错误,即帖子正在完成但没有返回数据?您能否确认云服务器已收到 POST 并且只是响应被客户端误解了?还是您认为请求没有成功?
  • 发出了请求,如果我检查网络,我可以看到所有数据都发送到服务器,但是在服务器上,打印所有可能的输入什么都没有显示。我现在不能使用 HTTPS,因为我还没有域名提供商。但我怀疑这是原因,我会收到网络错误(没有提示错误,服务器返回 200 状态)。
  • 我正在考虑获取base64然后解码到服务器上的文件,我已经尝试弹出(expo sdk 40),但没有成功。

标签: react-native axios expo multipartform-data form-data


【解决方案1】:

也许你需要在你的 Android Manifest 上启用

android:usesCleartextTraffic="true"

您的问题出在 Android 或 iOS 设备上?

【讨论】:

  • 我在 android 设备上遇到问题,顺便说一句,如何启用它,我在托管工作流上使用 Expo,我无权访问 .android.ios 文件夹
猜你喜欢
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2012-08-19
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2014-06-18
相关资源
最近更新 更多