В настоящее время я пытаюсь отладить пакет, поддерживающий реакцию (реагировать-родной-загрузчик), который я использую, чтобы попытаться загрузить пакет файлов (фотографий). Несмотря на работу над 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, поэтому любой вклад будет признателен.
Да, с теми же параметрами: 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
@ArielSalem, что заголовок Accept определенно неверен (потому что это заголовок на стороне сервера); скорее всего, это должен быть ContentType; со значением multipart/form-data (которое может быть установлено new FormData(), а более поздний Accept не принимается во внимание).
@MartinZeitler, спасибо за внимание. Я попробую и посмотрю, сработает ли это
@MartinZeitler, спасибо за внимание. Я должен упомянуть, что репо по умолчанию (github.com/tranquangvu/react-native-uploader/blob/master/…) принимает заголовки. Хорошей новостью является то, что отключение заголовков Accept для ContentType вернуло неверную ошибку запроса: Response{protocol=http/1.1, code=400, message=Bad Request Плохая новость в том, что я понятия не имею, почему изменение ContentType изменило бы его. Я собираюсь взглянуть на ссылку, которую вы разместили ниже, и посмотрю, смогу ли я почерпнуть какую-либо информацию о проблеме.
@ArielSalem полагает, что сервер может принимать только application/x-www-form-urlencoded ... если оставить заголовок Accept, это не имеет значения. Я могу ошибаться, хотя я все еще считаю, что этот заголовок является серверным (потому что я не могу представить себе ситуацию, когда клиент должен был бы принять). multipart/form-data будет лучшим типом контента для загрузки изображений, но только в том случае, если сервер его принимает.
@MartinZeitler, только что увидел этот комментарий. Я думаю, вы затронули важный вопрос. похоже, что репо устанавливает значение по умолчанию для заголовков Accept, которое сбрасывает значение, а не добавляет дополнительное значение. Если это так, то проблема может быть в этом. Я изменю заголовки на addHeaders и посмотрю, имеет ли это значение.
@MartinZeitler, хотя ссылка, которую вы отправили, похоже, имеет дело с аналогичными обстоятельствами (например, добавление данных формы для отправки через тело запроса), предложенное решение не кажется подходящим, поскольку существующее репо уже кажется для выполнения аналогичных функций: (github.com/tranquangvu/react-native-uploader/blob/master/…)
@MartinZeitler, как ни странно, после настройки исходного кода на addHeader (чтобы учесть другой тип заголовка) время ожидания вызова загрузки истекло. Я проведу локальное тестирование, чтобы узнать, что происходит




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, и не похоже, что это проблема, поскольку он все еще возвращает ту же ошибку. Спасибо за внимание!
@ArielSalem все зависит от того, что сервер ожидает, для публикации изображения без формы это будет, например. MediaType.parse("image/png"). посмотреть рецепты: github.com/square/okhttp/wiki/Recipes
Верно, таково поведение по умолчанию. Поскольку мы публикуем файлы image/jpg и используем MediaType.parse(mimetype) [github.com/tranquangvu/react-native-uploader/blob/master/…, где mimetype = 'image/jpg', похоже, здесь проблема не в MediaType.
Таким образом, в основном сервер ожидает изображение / png, что означает, что существующие функции должны иметь возможность анализировать информацию соответствующим образом, поскольку мы не отправляем форму. К сожалению, сопровождающий репо не активен / не реагирует, поэтому я буду бездельничать, пока не найду решение. Спасибо за помощь @MartinZeitler
Чтобы решить эту проблему, мне пришлось отказаться от пакета 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);
});
вы уверены, что данная имплементация работает нормально на iOS?