'HTTP 400 Bad Request - Invalid Header with Retrofit on Android
I'm migrating my Android project from Apache HttpClient to Retrofit with OkHttp. POST/PUT request return error, even though the application custom headers are the same and Content-Length of both request are equal.
- GET: work fine.
- POST/PUT:
Http Error 400 Bad Request - Invalid Header
. even though
For reference, the server is implemented using ASP.NET
on Windows Azure
.
Apache HttpClient:
HttpPut put = new HttpPut(<URL>);
StringEntity se = new StringEntity(json);
se.setContentEncoding("UTF-8");
se.setContentType("application/json");
put.setEntity(se);
response = client.execute(put);
Retrofit + OkHttp:
// API
@PUT("/<path>")
Response updateThing(@Body Dto dto);
// OkHttpClient
@Override
public Response execute(Request r) throws IOException {
List<Header> headers = HttpHelper.headerFor(method, url, etc);
// Create new request with required headers
Request encodedRequest = new Request(method, url, headers, r.getBody());
return super.execute(encodedRequest);
}
The server returns:
---> HTTP PUT https://example.com/path
Content-Type: application/json; charset=UTF-8
Content-Length: 53
{"user_id":"0","latitude":"0.0","longitude":"0.0"}
---> END HTTP (53-byte body)
PUT https://example.com/path
Authorization Basic bmfweEskWkvlabF0ZSQ=
Content-Type application/json
Accept application/json
HashKey 8eb93b898ddc2b74685ed2be64c76cc3af973ebc6b628781fe50eedcbe29376f
<--- HTTP 400 https://example.com/path (1397ms)
: HTTP/1.1 400 Bad Request
Connection: close
Content-Length: 339
Content-Type: text/html; charset=us-ascii
Date: Sat, 04 Jan 2014 08:26:45 GMT
OkHttp-Received-Millis: 1388824004870
OkHttp-Response-Source: NETWORK 400
OkHttp-Selected-Transport: http/1.1
OkHttp-Sent-Millis: 1388824004785
Server: Microsoft-HTTPAPI/2.0
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Header</h2>
<hr><p>HTTP Error 400. The request has an invalid header name.</p>
</BODY></HTML>
<--- END HTTP (339-byte body)
Edit:
- Sending POST/PUT requests using online Hurl.it works.
- Sending POST/PUT requests without any body using Retrofit works too.
Solution 1:[1]
Not sure what the server expects as a header parameter, but you can pass any header value on the client interface
@PUT("/<path>")
Response updateThing(@Header("headerName") String headerName, @Body Dto dto);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | abs |