对于PHP,发送PUT请求方法是错误的
我正试图将一个PUT请求方法从我的Android应用程序发送到我的PHP端点,但在我的端点中,PUT请求未被识别为PUT请求,因此我返回请求方法错误来自我的端点的消息 Android接口与请求执行 激活接口 我不知道为什么对于PHP,发送PUT请求方法是错误的,php,android,put,retrofit2,http-put,Php,Android,Put,Retrofit2,Http Put,我正试图将一个PUT请求方法从我的Android应用程序发送到我的PHP端点,但在我的端点中,PUT请求未被识别为PUT请求,因此我返回请求方法错误来自我的端点的消息 Android接口与请求执行 激活接口 我不知道为什么$\u服务器['REQUEST\u METHOD']==“PUT”是错误的,但是我想知道我是否在改型2上遗漏了什么 更多信息。 我用的是改型2 更新1:将json发送到正文中 我正在尝试使用主体发送json 这是我的json: { "number": 1,
$\u服务器['REQUEST\u METHOD']==“PUT”
是错误的,但是我想知道我是否在改型2上遗漏了什么
更多信息。 我用的是改型2
更新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;
}
我是否需要在我的请求配置中设置此选项?如果我需要它,我该怎么做
更新3:检查发送邮件的请求类型。
现在我正在检查请求的类型。因为我对PUT/POST请求也有同样的问题。因此,如果能用put解决问题,也许所有的问题都会解决
当我执行请求并询问和检查请求时,它正在发送类型(PUT/POST),但在服务器中php仅检测或获取??(下面的示例使用的是POST,行为相同)
所以我向服务器发送POST(无论是否发送PUT)请求,但为什么在服务器中我收到GET。我被锁上了!!!我不知道问题出在哪里
更新4:godaddy主机。
我的php服务器托管在godaddy上。这有什么问题吗?我创建了一个本地主机,一切都运行得很好,但相同的代码在godaddy上不起作用。我做了一些研究,但是我没有找到这个问题的好答案,所以godaddy托管可能是个问题吗?我想问题在于你没有在
PUT
请求中传递任何数据,这就是为什么PHP将请求识别为GET
。因此,我认为您只需要尝试使用@FormUrlEncoded
,@Multipart
或@Body
注释传递一些数据PHP除了GET和POST之外不识别任何东西。服务器应该向您抛出一些错误,比如空请求
和其他请求使用
$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中添加标题,应创建拦截器:
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);
在使用改型或任何其他网络库之前,应该使用请求http生成器(如或)检查端点。要在运行应用程序或单元测试时调试请求/响应,请使用类似的代理,这将有助于您观察请求/响应的真实外观 将
$\u服务器['REQUEST\u METHOD']
返回到客户端,查看请求是什么method@shayanpourvatan我这样做了,但是服务器返回GET,我不知道为什么?我更改了请求,但问题是相同的。我不知道我做错了什么。嗯。。。我不是PHP方面的专家,但它会导致方法类型使用双引号而不是单引号的问题吗?我的意思是,也许您应该将条件更改为以下内容:$\u服务器['REQUEST\u METHOD']=='PUT'
。我做了一个测试,将$\u服务器['REQUEST\u METHOD']
的结果发送回去,其值为GET
。所以我认为问题在于改型2,不是改型2而是我的配置。我不知道是否需要发送或配置其他内容。我被锁定在这里。也许你在将你的Android代码更改为最新版本之前做了那个测试,它在PUT
request中传递了一些数据?你有没有任何代码可以使用改型2并发送PUT/POST请求?我很确定我在请求配置中做错了什么或遗漏了什么,但我不知道是什么。我一直在寻找。
@PUT("device/activate.php")
Call<DeviceRegistry> registryDevice(@Body DataInfo info);
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Call<UpdateResponse> requestCall = client.updateMedia(downloadItemList);
Log.i("CCC", requestCall .request().toString());
Request{method=POST, url=http://myserver/api/v1/media/updateMedia.php, tag=null}
$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);
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);