Ошибки Android React-native-uploader

В настоящее время я пытаюсь отладить пакет, поддерживающий реакцию (реагировать-родной-загрузчик), который я использую, чтобы попытаться загрузить пакет файлов (фотографий). Несмотря на работу над ios, текущая реализация возвращает следующую ошибку для android:

Response{protocol=http/1.1, code=405, message=Method Not Allowed, url=${config.apiBase}/load/${this.props.id}/uploadconfirmation}

Ошибка возникает из этой строки в пакете:

Response response = client.newCall(request).execute();

Где находится клиент:

private final OkHttpClient client = new OkHttpClient()

Где запрос:

Request{method=POST, url=${config.apiBase}/load/${this.props.id}/uploadconfirmation, tag=null}

Я успешно отправлял сообщения в конечную точку, используя formdata:

    let tData = new FormData();
    const that = this;

    tData.append("confirmation_doc", {
      uri: files[0].filepath,
      type: "image/jpeg",
      name: "confirmation_doc.jpg",
    });    

    axios.post(
      `${config.apiBase}/load/${this.props.id}/uploadconfirmation`,
           tData
    )
    .then(response => {
        Alert.alert(
          "Success",
          "Uploaded Successfully!",
          [{ text: "OK", onPress: () => that.props.close() }],
          { cancelable: false }
        );
    });

Я попытался просмотреть исходный код, чтобы определить, где что-то разваливается, и кажется, что все публикуется, как должно (заголовки выглядят хорошо, метод выглядит хорошо, конечная точка выглядит хорошо). Я не слишком хорошо знаком с Java, поэтому любой вклад будет признателен.

вы уверены, что данная имплементация работает нормально на iOS?

GvSharma 15.09.2018 20:03

Да, с теми же параметрами: RNUploader.upload(opts, (err, response) => {});, где opts - это let opts = { url: ${config.apiBase}/load/${this.props.id}/uploadconfirmation, files, method: "POST", headers: { Accept: "application/x-www-form-urlencoded", Authorization: Bearer ${this.props.user.token}, }, };, приложение с поддержкой реакции правильно загружает файлы на ios

Ariel Salem 15.09.2018 20:10

@ArielSalem, что заголовок Accept определенно неверен (потому что это заголовок на стороне сервера); скорее всего, это должен быть ContentType; со значением multipart/form-data (которое может быть установлено new FormData(), а более поздний Accept не принимается во внимание).

Martin Zeitler 15.09.2018 20:13

@MartinZeitler, спасибо за внимание. Я попробую и посмотрю, сработает ли это

Ariel Salem 15.09.2018 20:17

@MartinZeitler, спасибо за внимание. Я должен упомянуть, что репо по умолчанию (github.com/tranquangvu/react-native-uploader/blob/master/…) принимает заголовки. Хорошей новостью является то, что отключение заголовков Accept для ContentType вернуло неверную ошибку запроса: Response{protocol=http/1.1, code=400, message=Bad Request Плохая новость в том, что я понятия не имею, почему изменение ContentType изменило бы его. Я собираюсь взглянуть на ссылку, которую вы разместили ниже, и посмотрю, смогу ли я почерпнуть какую-либо информацию о проблеме.

Ariel Salem 15.09.2018 20:29

@ArielSalem полагает, что сервер может принимать только application/x-www-form-urlencoded ... если оставить заголовок Accept, это не имеет значения. Я могу ошибаться, хотя я все еще считаю, что этот заголовок является серверным (потому что я не могу представить себе ситуацию, когда клиент должен был бы принять). multipart/form-data будет лучшим типом контента для загрузки изображений, но только в том случае, если сервер его принимает.

Martin Zeitler 15.09.2018 20:43
stackoverflow.com/questions/51259058/… это может быть другой вариант.
Martin Zeitler 17.09.2018 17:22

@MartinZeitler, только что увидел этот комментарий. Я думаю, вы затронули важный вопрос. похоже, что репо устанавливает значение по умолчанию для заголовков Accept, которое сбрасывает значение, а не добавляет дополнительное значение. Если это так, то проблема может быть в этом. Я изменю заголовки на addHeaders и посмотрю, имеет ли это значение.

Ariel Salem 17.09.2018 17:22

@MartinZeitler, хотя ссылка, которую вы отправили, похоже, имеет дело с аналогичными обстоятельствами (например, добавление данных формы для отправки через тело запроса), предложенное решение не кажется подходящим, поскольку существующее репо уже кажется для выполнения аналогичных функций: (github.com/tranquangvu/react-native-uploader/blob/master/…)

Ariel Salem 17.09.2018 17:36

@MartinZeitler, как ни странно, после настройки исходного кода на addHeader (чтобы учесть другой тип заголовка) время ожидания вызова загрузки истекло. Я проведу локальное тестирование, чтобы узнать, что происходит

Ariel Salem 17.09.2018 17:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

HTTP 405 Method Not Allowed ... - ошибка на стороне клиента.

The method received in the request-line is known by the origin server but not supported by the target resource.

если JavaScript работает, а Java - нет ... возможно, вы ищете MultipartBuilder

... в сочетании с MediaType.FORM.

Привет, @MartinZeitler, я играл с MediaType, и не похоже, что это проблема, поскольку он все еще возвращает ту же ошибку. Спасибо за внимание!

Ariel Salem 17.09.2018 16:17

@ArielSalem все зависит от того, что сервер ожидает, для публикации изображения без формы это будет, например. MediaType.parse("image/png"). посмотреть рецепты: github.com/square/okhttp/wiki/Recipes

Martin Zeitler 17.09.2018 16:25

Верно, таково поведение по умолчанию. Поскольку мы публикуем файлы image/jpg и используем MediaType.parse(mimetype) [github.com/tranquangvu/react-native-uploader/blob/master/…, где mimetype = 'image/jpg', похоже, здесь проблема не в MediaType.

Ariel Salem 17.09.2018 17:14

Таким образом, в основном сервер ожидает изображение / png, что означает, что существующие функции должны иметь возможность анализировать информацию соответствующим образом, поскольку мы не отправляем форму. К сожалению, сопровождающий репо не активен / не реагирует, поэтому я буду бездельничать, пока не найду решение. Спасибо за помощь @MartinZeitler

Ariel Salem 17.09.2018 17:19
Ответ принят как подходящий

Чтобы решить эту проблему, мне пришлось отказаться от пакета react-native-uploader, который я использовал. Вот как мне удалось решить проблему:

let tData = new FormData();

this.state.selectedImages.forEach((item, i) => {
  tData.append("doc[]", {
    uri: item.uri,
    type: "image/jpeg",
    name: item.filename || `filename${i}.jpg`,
  });
});

fetch(`${config.apiBase}/load/${this.props.id}/uploadconfirmation`, {
  method: "post",
  headers: {
    Accept: "application/x-www-form-urlencoded",
    Authorization: `Token ${this.props.token}`,
  },
  body: tData,
})
  .then(res => res.json())
  .then(res => {
    Alert.alert(
      "Success",
      "Uploaded Successfully!",
      [{ text: "OK", onPress: () => that.props.close() }],
      { cancelable: false }
    );
  })
  .catch(err => {
    console.error("error uploading images: ", err);
  });

Другие вопросы по теме