2017-09-25 5 views
2

저는 curl을 사용하여 만든 것과 비슷한 모방을하기 위해 REST API를 호출하는 간단한 Java 코드를 작성했습니다. 컬 명령은 로그인 엔드 포인트에 POST 요청을 보냅니다 :응용 프로그램의 내용 유형에 charset이 포함되어 있습니다.

이 성공
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ 
"username": "MicroStrategy", 
"password": "MyPassword", 
"loginMode": 1 
}' 'https://env-792.customer.cloud.microstrategy.com/MicroStrategyLibrary/api/auth/login' 

, 다시 204 HTTP 응답 코드와 HTTP 헤더로 토큰을 얻는다.

이제 다음 코드를 사용하여 동일한 결과를 얻지 못했고 대신 HTTP 200과 토큰이없고 본체가 없습니다. 내가 잘못하고 있었는지 이해하려고 노력하는 과정에서

MediaType mediaType = MediaType.parse("application/json"); 
RequestBody body = RequestBody.create(mediaType, "{\"username\": \"MicroStrategy\", \"password\": \"MyPassword\", \"loginMode\": 1}"); 
Request urlrequest = new Request.Builder() 
    .url("https://env-792.customer.cloud.microstrategy.com/MicroStrategyLibrary/api/auth/login") 
    .addHeader("accept", "application/json") 
    .post(body) 
    .build(); 
OkHttpClient client = new OkHttpClient(); 
Response urlresponse = client.newCall(urlrequest).execute(); 

, 나는 리버스 프록시를 통해 요청을 (내가 "찰스"를 사용) 실행 및 okhttp3가 설정 한 내용 유형의 캐릭터 세트를 포함한 것을 깨달았 응용 프로그램/JSON은 :

POST /MicroStrategyLibrary/api/auth/login HTTP/1.1 
accept: application/json 
Content-Type: application/json; charset=utf-8 
Content-Length: 63 
Connection: Keep-Alive 
Accept-Encoding: gzip 
User-Agent: okhttp/3.8.0 
Host: env-792.customer.cloud.microstrategy.com 

{"username": "MicroStrategy", "password": "MyPassword", "loginMode": 1} 

나는 일치하는 컬 문이 알려진 문제가

curl -X POST --header 'Content-Type: application/json; charset=utf-8' --header 'Accept: application/json' -d '{ 
"username": "MicroStrategy", 
"password": "MyPassword", 
"loginMode": 1 
}' 'https://env-792.customer.cloud.microstrategy.com/MicroStrategyLibrary/api/auth/login' 

실패하는 것을 확인? (콘텐츠 유형에 대한 RFC가 text/* content-types에 대해서만 charset을 허용한다는 것을 알고 있지만이 분야에 대한 전문가는 아닙니다!)

제거 할 Content-Type을 덮어 쓰려면 어떻게해야합니까? charset 부분?

답변

1

Java String을 사용하여 JSON 데이터를 RequestBody.create()으로 전달합니다. OkHttp 문서 당 :

 
public static RequestBody create(@Nullable 
           MediaType contentType, 
           String content) 

콘텐츠를 전송하는 새로운 요청 본문을 돌려줍니다. contentType이 null이 아니고 charset이없는 경우 UTF-8을 사용합니다.

그래서, 당신이 의도적으로 사용하는 방법은 UTF-8 강제, 그래서 가능성이 charset 속성이 일치하도록 추가된다.

다른 create() 메서드 중 하나를 사용하여 byte[] 또는 okio.ByteString을 Java String 대신 입력으로 사용하십시오. 그들이 입력으로 원시 바이트를 복용하고 있기 때문에 charset 경우에만 사람이 실제로 필요한 지정하는 호출자의 책임입니다, 그래서 그들은, UTF-8 강제로 문서화되지 않습니다

RequestBody body = RequestBody.create(mediaType, "{\"username\": \"MicroStrategy\", \"password\": \"MyPassword\", \"loginMode\": 1}".getBytes(StandardCharsets.UTF_8)); 

RequestBody body = RequestBody.create(mediaType, okio.ByteString.encodeUtf8("{\"username\": \"MicroStrategy\", \"password\": \"MyPassword\", \"loginMode\": 1}")); 
+0

I 'byte()'입력으로'create()'를 사용했는지 확인하십시오. 해결 방법을 사용하는 것을 싫어하지만이 시점에서 충분합니다. :) –