Я пытаюсь отправить метод запроса PUT из приложения Android на конечную точку PHP, но в моей конечной точке запрос PUT не распознается как запрос PUT, поэтому я возвращаюсь Неверный метод запроса! сообщение от моей конечной точки.
@PUT("device/activate.php")
Call<DeviceRegistry> registryDevice();
DeviceRegistryAPI registryAPI =
RetrofitController.getRetrofit().create(DeviceRegistryAPI.class);
Call<DeviceRegistry> registryCallback = registryAPI.registryDevice();
response = registryCallback.execute();
При этом я ожидаю ответа, но получаю сообщение об ошибке конечной точки.
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.
Я пытаюсь отправить 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);
Но у меня та же проблема.
У меня есть этот заголовок в моем клиенте REstfull:
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Нужно ли указывать это в конфигурации моего запроса? Как мне это сделать, если мне это нужно?
Сейчас я проверяю тип запроса. Потому что у меня та же проблема с запросами 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. Я заперт !!! Я не знаю, где проблема.
У меня есть мой php сервер хостинг на Godaddy. Есть ли проблемы с этим? Я создаю локальный хост, и все работает довольно хорошо, но тот же код не работает на Godaddy. Я провел некоторое исследование, но не нашел хорошего ответа на эту проблему, так возможно ли, что хостинг Godaddy является проблемой?
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);
не проверял, но должен работать.
Я думаю, проблема в том, что вы не передаете никаких данных вместе с PUT
запрос, поэтому PHP распознает запрос как GET
, Поэтому я думаю, что вам просто нужно попытаться передать некоторые данные, используя @FormUrlEncoded
, @Multipart
или, возможно, @Body
аннотации
Чтобы добавить заголовок в свою модификацию 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);
‘REQUEST_METHOD’ Какой метод запроса был использован для доступа к странице;
то есть «GET», «HEAD», «POST», «PUT».
Прежде чем использовать Retrofit или любую другую сетевую библиотеку, вы должны проверить конечную точку с помощью http-компоновщика запросов, например Почтальон или же Расширенный Отдых Клиента. Для отладки запроса / ответа при запуске приложения или модульных тестов используйте прокси-сервер, например Чарльз, это поможет вам увидеть, как на самом деле выглядит ваш запрос / ответ.