Android — Retrofit2 отправка метода запроса PUT является неправильным для переполнения стека

Я пытаюсь отправить метод запроса PUT из приложения Android на конечную точку PHP, но в моей конечной точке запрос PUT не распознается как запрос PUT, поэтому я возвращаюсь Неверный метод запроса! сообщение от моей конечной точки.

Интерфейс Android и выполнение запросов

Интерфейс для активации

@PUT("device/activate.php")
Call<DeviceRegistry> registryDevice();

Выполнение запроса

DeviceRegistryAPI registryAPI =
RetrofitController.getRetrofit().create(DeviceRegistryAPI.class);

Call<DeviceRegistry> registryCallback = registryAPI.registryDevice();

response = registryCallback.execute();

При этом я ожидаю ответа, но получаю сообщение об ошибке конечной точки.


Моя конечная точка PHP

if($_SERVER['REQUEST_METHOD'] == "PUT"){
//doing something with the data
} else {
$data = array("result" => 0, "message" => "Request method is wrong!");
}

Я не знаю почему $_SERVER['REQUEST_METHOD'] == "PUT" неверно, но мне интересно, если я что-то упустил на Retrofit 2.


Больше информации.

Я использую Retrofit2.


Обновление 1: отправка JSON в тело

Я пытаюсь отправить JSON, используя тело.

Это мой JSON:

{
"number": 1,
"infoList": [
{
"id": 1,
"info": "something"},
{
"id": 2,
"info": "something"}
]
}

Есть мои занятия:

class DataInfo{

public int number;
public List<Info> infoList;

public DataInfo(int number, List<Info> list){
this.number = number;
this.infoList = list;
}
}class Info{
public int id;
public String info;
}

Я изменил интерфейс PUT к этому:

@PUT("device/activate.php")
Call<DeviceRegistry> registryDevice(@Body DataInfo info);

Но у меня та же проблема.


Обновление 2: мне нужен заголовок

У меня есть этот заголовок в моем клиенте REstfull:

Accept: application/json
Content-Type: application/x-www-form-urlencoded

Нужно ли указывать это в конфигурации моего запроса? Как мне это сделать, если мне это нужно?

Обновление 3: проверка типа запроса моего отправляющего сообщения.

Сейчас я проверяю тип запроса. Потому что у меня та же проблема с запросами PUT / POST. Так что, если удастся решить проблему с положенным, возможно, все проблемы будут решены.

Когда я выполняю запрос, спрашиваю и проверяю запрос, он отправляет тип (PUT / POST), но на сервере php только обнаружить или GET ?? (приведенный ниже пример использует СООБЩЕНИЕ и поведение такое же)

Call<UpdateResponse> requestCall = client.updateMedia(downloadItemList);
Log.i("CCC", requestCall .request().toString());

И вывод POST:

Request{method=POST, url=http://myserver/api/v1/media/updateMedia.php, tag=null}

поэтому я отправляю серверу запрос POST (независимо от того, отправляю ли я PUT), но почему на сервере я получаю GET. Я заперт !!! Я не знаю, где проблема.

Обновление 4: Годди хостинг.

У меня есть мой php сервер хостинг на Godaddy. Есть ли проблемы с этим? Я создаю локальный хост, и все работает довольно хорошо, но тот же код не работает на Godaddy. Я провел некоторое исследование, но не нашел хорошего ответа на эту проблему, так возможно ли, что хостинг Godaddy является проблемой?

4

Решение

PHP не распознает ничего, кроме GET и POST. сервер должен выдать вам какую-то ошибку, например, пустой запрос.

Чтобы получить доступ к PUT и другие запросы использования

$putfp = fopen('php://input', 'r'); //will be a JSON string (provided everything got sent)
$putdata = '';
while($data = fread($putfp, filesize('php://input')))
$putdata .= $data;
fclose($putfp);
//php-like variable, if you want
$_PUT = json_decode($putdata);

не проверял, но должен работать.

2

Другие решения

Я думаю, проблема в том, что вы не передаете никаких данных вместе с PUT запрос, поэтому PHP распознает запрос как GET, Поэтому я думаю, что вам просто нужно попытаться передать некоторые данные, используя @FormUrlEncoded, @Multipart или, возможно, @Body аннотации

1

Чтобы добавить заголовок в свою модификацию 2, вы должны создать перехватчик:

        Interceptor interceptor = new Interceptor() {
@Override
public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException
{
okhttp3.Request.Builder ongoing = chain.request().newBuilder();
ongoing.addHeader("Content-Type", "application/x-www-form-urlencoded");
ongoing.addHeader("Accept", "application/json");

return chain.proceed(ongoing.build());
}
};

и добавьте его в свой клиентский сборщик:

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.interceptors().add(interceptor);
1

  1. PHP распознает вызовы PUT. Извлеченный из PHP.net:

‘REQUEST_METHOD’ Какой метод запроса был использован для доступа к странице;
то есть «GET», «HEAD», «POST», «PUT».

  1. Вам не нужно отправлять заголовки, если ваш сервер не ожидает
    заголовок.

Прежде чем использовать Retrofit или любую другую сетевую библиотеку, вы должны проверить конечную точку с помощью http-компоновщика запросов, например Почтальон или же Расширенный Отдых Клиента. Для отладки запроса / ответа при запуске приложения или модульных тестов используйте прокси-сервер, например Чарльз, это поможет вам увидеть, как на самом деле выглядит ваш запрос / ответ.

1
По вопросам рекламы [email protected]