簡體   English   中英

retrofit2發送PUT請求方法對於PHP是錯誤的

[英]retrofit2 sending a PUT request method is wrong for PHP

我正在嘗試從我的Android應用程序向我的PHP端點發送PUT請求方法,但在我的端點中,PUT請求未被識別為PUT請求,因此我返回Request方法錯誤! 來自我的端點的消息。

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? (以下示例使用POST ,行為相同)

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:godaddy托管。

我有我的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注釋傳遞一些數據

要在retrofit2中添加標題,您應該創建一個攔截器:

        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. PHP識別'PUT'調用。 PHP.net中提取:

'REQUEST_METHOD'使用哪種請求方法來訪問頁面; 即'GET','HEAD','POST','PUT'。

  1. 如果您的服務器不期望任何標頭,則無需發送任何標頭。

在使用Retrofit或任何其他網絡庫之前,您應該使用請求http構建器(如PostmanAdvanced Rest Client)檢查端點。 要在運行應用程序或單元測試時調試請求/響應,請使用像Charles這樣的代理,它將幫助您了解您的請求/響應的真實外觀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM